【问题标题】:how to add and remove an item in js array using string index如何使用字符串索引在js数组中添加和删除项目
【发布时间】:2014-01-09 07:52:33
【问题描述】:

大家好,我想首先使用字符串索引在数组中添加项目,然后使用相同的字符串索引删除该项目。 例如

var array = new Array();
array['i1'] = '9807988';
array['i2'] = '9875353';
array['i3'] = '9875353';

现在我有索引 i2 并想删除该项目

var key = 'i2';
array.splice(key,1)

但这不适用于我的情况。这里 i1,i2,...in 及其值 9807988,9875353,... 在我的情况下是动态的。我必须使用键 i1,i2 而不是它们的值来删除。请告诉我我做错了什么。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    Elias 是对的,它实际上是一个对象,你可以使用delete 来删除一个对象的属性

    delete array[key];
    

    【讨论】:

      【解决方案2】:

      没有创建Array 实例! JS 不知道关联数组,它们是对象。当你定义一个非数字的 "index" 时,数组就变成了一个对象,失去了所有像 length 和典型数组方法这样的好东西。

      这归结于JS一开始并没有数组,而是后来才引入的。 Array 构造函数实际上只是Object.prototype 的扩充。您可以通过以下几种方式进行检查:

      var anArray = [1,2];
      for(var index in anArray) console.log( typeof index);
      

      这每次都会记录string,而不是Number,因为在内部数组是一个对象,所以所有数字索引都被强制转换为字符串。
      这也解释了为什么您的代码(使用数组作为对象)可以正常工作。

      在对象上使用splice 是一个坏主意的主要原因是 ECMAScript 规范没有强制执行给定的属性顺序必须添加到对象中。例如,Chrome 的 V8 引擎会按字母顺序对它们进行排序,但您不保证其他引擎会做同样的事情,因此您的代码会表现得无法预测。

      注意:
      不要使用new Array,它会时不时地让你大吃一惊:

      var someNumber = 213;
      var a = new Array();//same as a = [];
      var b = new Array(someNumber);// NOT the same as b = [someNumber]
      console.log(b.length);//213!!!!
      console.log(b);//[undefined, undefined, undefined,....]
      var c = new Array(someNumber + '');//THE SAME as b = [someNumber + '']
      console.log(c);//['213']
      

      因此,根据您传递给数组构造函数的内容,生成的数组可能与您预期的不同。
      至于你的代码,写:

      var yourObject = { i1: '9807988',
                         i2: '9875353',
                         i3: '9875353'};
      delete(yourObject.i2);
      //or
      delete(yourObject['i2']);
      

      阅读 MDN 上的对象可以做什么

      【讨论】:

      • 根据ECMAScript Specification,属性名称P是数组索引当且仅当ToString(ToUint32(P))等于P
      • @Korikulum:是的,我以什么方式反驳了这一点?一些值 => 转换为无符号 32 位 int => TO STRING 是索引...
      • 你误会了,我只是给出了规格的链接。
      【解决方案3】:

      这里是DEMO to remove item

       var array = new Array();
       array[0] = '9807988';
       array[1] = '9875353';
       array[2] = '9875353';
      
      
       var key = 1;
       array.splice(key,1)
      
      for(i=0;i<array.length; i++)
      { document.write(array[i]);
        document.write('</br>');
      }
      

      【讨论】:

      • 在很多层面上都错了......至少不是:document.write
      猜你喜欢
      • 2015-09-27
      • 2014-12-18
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多