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

Why arrays.splice() function does not remove the element?

我对 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!

问题出在这一行

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

替换为

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

因为数组中的 none 个对象有 key 作为 key/property。

完整代码下面有DEMO

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);

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

arrObj.splice[index,1]; 

你应该把

arrObj.splice(index,1); 

您的 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. 语法:

     arrObj.splice[index,1];
    

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

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

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

    最好写成:

    if (arrObj[i]["key1"] !== undefined){
    

但是你可以像这样写得更优雅:

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

或使用 EcmaScript 2015 语法:

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

请注意,这将删除所有具有 "key1" 作为 属性 的元素,而不仅仅是第一个。

如果你愿意,你可以把它变成一个像这样的函数,用一个功能片段来说明:

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));