为什么 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));
两期:
语法:
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);
请注意,这将删除所有具有 "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));
我对 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));
两期:
语法:
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);
请注意,这将删除所有具有 "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));