为什么arrays.splice()函数不会删除元素?

时间:2016-04-27 14:19:36

标签: javascript arrays array-splice

我对splice()函数有一种奇怪的行为。

假设这是数组:

var arrObj = [{"key1":"val1"},{"key2":"val2"}];

如果我从浏览器控制台制作:

arrObj.splice(0,1);

第一个元素按预期被删除。

但是如果我在函数中进行此操作,则拼接不会对数组进行任何更改!

怎么可能?

修改

var index = undefined;
for (var i=0; i<arrObj.length; i++) {
    if (arrObj[i].key1 == "key1"){
        index = i;
        break;
    }
}
if (index != undefined) 
    arrObj.splice[index,1];  // this doesn't work!

4 个答案:

答案 0 :(得分:3)

您的index未定义,因为arrObj没有key属性

if (arrObj[i].key == "key1") {
    index = i;
    break;
}

更改为

if (arrObj[i].key1) {
    index = i;
    break;
}

工作示例

var arrObj = [{ "key1": "val1" }, { "key2": "val2" }];
var index = undefined;

for (var i = 0; i < arrObj.length; i++) {
    if (arrObj[i].key1) {
        index = i;
        break;
    }
}

if (index != undefined)
    arrObj.splice(index, 1);

document.write(JSON.stringify(arrObj));

答案 1 :(得分:2)

问题在于这一行

if (arrObj[i].key == "key1"){

将其替换为

if (Object.keys(arrObj[i])[0] == "key1"){

因为数组中没有任何对象具有key作为键/属性。

使用 DEMO

下面的完整代码

&#13;
&#13;
var arrObj = [{"key1":"val1"},{"key2":"val2"}];
var index = undefined;
for (var i=0; i<arrObj.length; i++) {
    if (Object.keys(arrObj[i])[0] == "key1"){
        index = i;
        break;
    }
}
if (index != undefined) 
    arrObj.splice(index,1); 

document.body.innerHTML += JSON.stringify(arrObj,0,4);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

你正在纠正自己。您在此行中使用[] intead ()

arrObj.splice[index,1]; 

你应该把

arrObj.splice(index,1); 

答案 3 :(得分:0)

两个问题:

  1. 语法:

     arrObj.splice[index,1];
    

    应该有括号(用于函数调用)而不是括号(对象属性):

     arrObj.splice(index,1);
    
  2. key不是任何数组元素中的键:

    if (arrObj[i].key == "key1"){
    

    最好写成:

    if (arrObj[i]["key1"] !== undefined){
    
  3. 但你可以像这样更优雅地写下这些:

    arrObj = arrObj.filter(function (el) {
        return el["key1"] === undefined;
    });
    

    或者使用EcmaScript 2015语法:

    arrObj = arrObj.filter((el) => el["key1"] === undefined);
    

    请注意,这将删除所有包含&#34; key1&#34;作为财产,不仅是第一个。

    如果您愿意,可以将其转换为这样的功能,并使用功能代码段进行说明:

    &#13;
    &#13;
    function removeByKey(arrObj, key) {
        return arrObj.filter(function (el) { return el[key] === undefined; });
    }
    
    // Sample data:
    arrObj = [{"key1":"val1"},{"key2":"val2"}];
    
    // Output original array
    document.write('before: ' + JSON.stringify(arrObj) + '<br>');
    
    // Call function
    arrObj = removeByKey(arrObj, "key1");
    
    // Output resulting array
    document.write('after: ' + JSON.stringify(arrObj));
    &#13;
    &#13;
    &#13;