我对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!
答案 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
下面的完整代码
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;
答案 2 :(得分:1)
你正在纠正自己。您在此行中使用[]
intead ()
:
arrObj.splice[index,1];
你应该把
arrObj.splice(index,1);
答案 3 :(得分:0)
两个问题:
语法:
arrObj.splice[index,1];
应该有括号(用于函数调用)而不是括号(对象属性):
arrObj.splice(index,1);
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);
请注意,这将删除所有包含&#34; key1&#34;作为财产,不仅是第一个。
如果您愿意,可以将其转换为这样的功能,并使用功能代码段进行说明:
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;