从数组Javascript中删除带有自定义索引的元素

时间:2014-08-31 14:11:35

标签: javascript arrays

我有几个看起来有点像这样的数组:

arr['a'] = 'val1';
arr['b'] = 'val2';
arr['c'] = 'val3';

索引不是整数,而是字符串。我想完全从数组中删除arr [' b']。我试过了:

arr.splice('b', 1); 

它不起作用,可能是因为索引不是整数,根据 w3schools这是问题"索引 - 必填。一个整数"。

一种可能的解决方案是循环遍历所有数组并使用整数索引重新创建它们,然后将数组保存为自定义索引作为值,将等效整数索引作为索引。

这似乎有点不必要,浪费资源,是否有更智能,更有效,更简单的解决方案?

最好是使用非整数索引的arr.splice。

我查看过很多帖子,内容涉及如何通过索引和值从数组中删除元素,但没有一篇介绍如何使用非整数索引删除元素。

我找到的帖子示例: 0 1 2

非常感谢任何和所有帮助!

//编辑,以下作为解决方案使用。

function aObj() {
    this.a = ""; 
    this.b = [];
}

var aObjs = [];
aObjs.push(new aObj);
aObjs.push(new aObj);
aObjs.push(new aObj);

aObjs[0].a = "val1";

aObjs.splice(1, 1);

看起来与我在第一个例子中使用的有点不同,但这对我如何使用它更准确。可能不是最好的方法,但它确实有效。

3 个答案:

答案 0 :(得分:3)

不要为string索引使用数组,使用像bellow

这样的对象
var arr = {} //create a object

arr['a'] = 'val1'; //asign values
arr['b'] = 'val2';
arr['c'] = 'val3';

console.log(arr) //prints {a: "val1", b: "val2", c: "val3"}

delete arr['a']  //delete a key

console.log(arr) // prints {b: "val2", c: "val3"}

答案 1 :(得分:1)

好吧它不起作用,因为你使用数组作为字典,但它不是。首先使用对象。第二次使用delete删除属性:

var dict = { 'a': 'val1', 'b': 'val2', 'c': 'val3' };
delete dict.a;

答案 2 :(得分:1)

如前所述,这不是Array。如果它应该是一个数组,它看起来像这样

var arr = ['val1', 'val2', 'val3'];

现在,您可以使用Array.splice删除值'val2'

arr.splice(1,1);
// or
arr.splice(arr.indexOf('val2'),1);
// or even
arr = arr.filter(function (v){ return v !== 'val2'});

如果它应该是一个对象,它的声明如下:

var obj = {a: 'val1', b: 'val2', c: 'val3'};

如果你想删除'val2'而不知道它的密钥,你可以循环:

for (var key in obj) {
  if (obj[key] === 'val2';
  delete obj[key];
}
// or (mis)use Object.keys 
Object.keys(obj)
      .filter(function(v){
               return this[v] === 'val2' ? !(delete this[v]) : true;
              }, obj);

知道了这一点,你可以为Objects Arrays创建一个帮助方法:

function removeByValue(objOrArr, value) {
   if (objOrArr instanceof Array && objOrArr.length) {
     var found = objOrArr.indexOf(value);
     if (found) { objOrArr.splice(found,1); }
   }
   if (objOrArr instanceof Object) {
     var keys = Object.keys(objOrArr);
     if (keys.length) {
       keys.filter(function(v){
               return this[v] === value ? !(delete this[v]) : true;
              }, objOrArr);
     }
   }
   return objOrArr;
}
// usage (using previous arr/obj)
removeByValue(arr, 'val2'); // arr now ['val1','val3']
removeByValue(obj, 'val2'); // obj now {a:'val1', c: 'val3'}

Example