如何从数组中删除一个对象?
我想要从someArray
中删除包含名字Kristian
的对象。例如:
someArray = [{name:"Kristian", lines:"2,5,10"},
{name:"John", lines:"1,19,26,96"}];
我想要实现:
someArray = [{name:"John", lines:"1,19,26,96"}];
如何从数组中删除一个对象?
我想要从someArray
中删除包含名字Kristian
的对象。例如:
someArray = [{name:"Kristian", lines:"2,5,10"},
{name:"John", lines:"1,19,26,96"}];
我想要实现:
someArray = [{name:"John", lines:"1,19,26,96"}];
您可以使用多种方法从数组中删除元素:
//1
someArray.shift(); // first element removed
//2
someArray = someArray.slice(1); // first element removed
//3
someArray.splice(0, 1); // first element removed
//4
someArray.pop(); // last element removed
//5
someArray = someArray.slice(0, someArray.length - 1); // last element removed
//6
someArray.length = someArray.length - 1; // last element removed
如果您想要删除位置为x
的元素,请使用:
someArray.splice(x, 1);
或者
someArray = someArray.slice(0, x).concat(someArray.slice(-x));
回复 @chill182 的评论:您可以使用 Array.filter
或结合 Array.findIndex
和 Array.splice
来从数组中移除一个或多个元素(请参阅 MDN)。
参见此 Stackblitz 项目 或下面的代码段:
// non destructive filter > noJohn = John removed, but someArray will not change
let someArray = getArray();
let noJohn = someArray.filter( el => el.name !== "John" );
log(`let noJohn = someArray.filter( el => el.name !== "John")`,
`non destructive filter [noJohn] =`, format(noJohn));
log(`**someArray.length ${someArray.length}`);
// destructive filter/reassign John removed > someArray2 =
let someArray2 = getArray();
someArray2 = someArray2.filter( el => el.name !== "John" );
log("",
`someArray2 = someArray2.filter( el => el.name !== "John" )`,
`destructive filter/reassign John removed [someArray2] =`,
format(someArray2));
log(`**someArray2.length after filter ${someArray2.length}`);
// destructive splice /w findIndex Brian remains > someArray3 =
let someArray3 = getArray();
someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1);
someArray3.splice(someArray3.findIndex(v => v.name === "John"), 1);
log("",
`someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1),`,
`destructive splice /w findIndex Brian remains [someArray3] =`,
format(someArray3));
log(`**someArray3.length after splice ${someArray3.length}`);
// if you're not sure about the contents of your array,
// you should check the results of findIndex first
let someArray4 = getArray();
const indx = someArray4.findIndex(v => v.name === "Michael");
someArray4.splice(indx, indx >= 0 ? 1 : 0);
log("", `someArray4.splice(indx, indx >= 0 ? 1 : 0)`,
`check findIndex result first [someArray4] = (nothing is removed)`,
format(someArray4));
log(`**someArray4.length (should still be 3) ${someArray4.length}`);
// -- helpers --
function format(obj) {
return JSON.stringify(obj, null, " ");
}
function log(...txt) {
document.querySelector("pre").textContent += `${txt.join("\n")}\n`
}
function getArray() {
return [ {name: "Kristian", lines: "2,5,10"},
{name: "John", lines: "1,19,26,96"},
{name: "Brian", lines: "3,9,62,36"} ];
}
<pre>
**Results**
</pre>
一个干净的解决方案是使用Array.filter
:
var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; });
这个方法存在的问题是,在IE < 9中它无法工作。但是,你可以引入一个JavaScript库的代码(例如underscore.js),来为任何浏览器实现此功能。
someArray = someArray.filter(function(el) { return el.Name != "Kristian"; });
是否已解决此问题? - hBrent我建议在处理这种常见任务时使用 lodash.js 或 sugar.js:
// lodash.js
someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });
// sugar.js
someArray.remove(function(el) { return el.Name === "Kristian"; });
在大多数项目中,使用像这样的库提供的一组辅助方法非常有用。
someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });
。 - Andy FordsomeArray = someArray.filter(function(e) { return e.Name !== "Kristian"; });
这行代码的作用是从数组中筛选出 Name 属性不等于 "Kristian" 的元素,并重新赋值给 someArray 变量。 - BenRES2015
->ES2015
let someArray = [
{name:"Kristian", lines:"2,5,10"},
{name:"John", lines:"1,19,26,96"},
{name:"Kristian", lines:"2,58,160"},
{name:"Felix", lines:"1,19,26,96"}
];
someArray = someArray.filter(person => person.name != 'John');
它将删除John!
这个怎么样?
$.each(someArray, function(i){
if(someArray[i].name === 'Kristian') {
someArray.splice(i,1);
return false;
}
});
$.each()
循环时会缓存数组的长度,这样会导致错误吗?也就是说,$.each()
会超出现在更短的数组长度进行循环。因此,someArray[i]
将是 undefined
,而 undefined.name
将会导致崩溃。 - nnnnnn{}
是用于具有属性名/值对的对象,但方括号 []
是用于数组 - 就像这样:someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];
.splice()
方法来删除项目。要删除第一个项目(索引0),请说:someArray.splice(0,1);
// someArray = [{name:"John", lines:"1,19,26,96"}];
如果您不知道索引,但希望通过搜索数组来查找名称为“Kristian”的项目进行删除,则可以执行以下操作:
for (var i =0; i < someArray.length; i++)
if (someArray[i].name === "Kristian") {
someArray.splice(i,1);
break;
}
编辑:我刚注意到你的问题标记了"jQuery",所以你可以尝试使用$.grep()
方法:
someArray = $.grep(someArray,
function(o,i) { return o.name === "Kristian"; },
true);
$.grep()
中的 "invert" 布尔参数吗?在这个例子中它并没有增加太多,因为我本可以使用 !=
。但在其他情况下,你可能已经定义了一个函数,恰好执行与你想要 grep 的相反测试,那么你可以使用该重载来反转结果,而不必定义额外的函数。 - nnnnnnfunction isEven(num) { return num%2===0 }
。你可以使用 $.grep(someArray, isEven)
来从数组中获取仅包含偶数的值,或者使用 $.grep(someArray, isEven, true)
来获取非偶数值。 - nnnnnn someArray = [{name:"Kristian", lines:"2,5,10"},
{name:"John", lines:"1,19,26,96"}];
someArray = someArray.filter(function(returnableObjects){
return returnableObjects.name !== 'Kristian';
});
//someArray will now be = [{name:"John", lines:"1,19,26,96"}];
箭头函数:someArray = someArray.filter(x => x.name !== 'Kristian')
const someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];
我们获取名称属性值为“Kristian”的对象的索引。
const index = someArray.findIndex(key => key.name === "Kristian");
console.log(index); // 0
通过使用splice函数,我们正在删除具有名称属性值为“Kristian”的对象
someArray.splice(index,1);
console.log(someArray); // [{name:"John", lines:"1,19,26,96"}]
这是一个对我有效的函数:
function removeFromArray(array, value) {
var idx = array.indexOf(value);
if (idx !== -1) {
array.splice(idx, 1);
}
return array;
}
我已经制作了一个动态函数,该函数接受对象数组、键和值,并在删除所需对象后返回相同的数组:
function removeFunction (myObjects,prop,valu)
{
return myObjects.filter(function (val) {
return val[prop] !== valu;
});
}
完整示例:演示
var obj = {
"results": [
{
"id": "460",
"name": "Widget 1",
"loc": "Shed"
}, {
"id": "461",
"name": "Widget 2",
"loc": "Kitchen"
}, {
"id": "462",
"name": "Widget 3",
"loc": "bath"
}
]
};
function removeFunction (myObjects,prop,valu)
{
return myObjects.filter(function (val) {
return val[prop] !== valu;
});
}
console.log(removeFunction(obj.results,"id","460"));