使用JavaScript从数组中删除对象

我怎样才能从数组中删除一个对象? 我希望从“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 

如果要删除位置x处的元素,请使用:

 someArray.splice(x,1); 

回复@ chill182的评论:你可以使用Array.filter (参见MDN )从数组中删除一个或多个元素,例如

 someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}, {name:"Brian",lines:"3,9,62,36" }]; johnRemoved = someArray.filter(function(el) { return el.name !== "John"; }); console.log(JSON.stringify(johnRemoved, null, ' ')); 

我build议使用underscore.js或sugar.js来执行这样的常见任务:

 // underscore.js someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; }); // sugar.js someArray.remove(function(el) { return el.Name === "Kristian"; }); 

在大多数项目中,像这样的图书馆提供一套辅助方法是非常有用的。

这个怎么样?

 $.each(someArray, function(i){ if(someArray[i].name === 'Kristian') { someArray.splice(i,1); return false; } }); 

如图所示,您的“数组”是无效的JavaScript语法。 大括号{}用于具有属性名称/值对的对象,但方括号[]用于数组,如下所示:

 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"}]; 

如果你不知道索引,但想通过数组来search名称为“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); 

干净的解决scheme将是使用Array.filter

 var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; }); 

这个问题是,它不能在IE <9的工作 。但是,你可以包括一个Javascript库(例如underscore.js )的代码,实现这个任何浏览器。

我做了一个dynamic函数,取出对象数组,键和值,并在删除所需的对象后返回相同的数组:

 function removeFunction (myObjects,prop,valu) { return myObjects.filter(function (val) { return val[prop] !== valu; }); } 

完整示例: DEMO

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

这是一个适用于我的function:

 function removeFromArray(array, value) { var idx = array.indexOf(value); if (idx !== -1) { array.splice(idx, 1); } return array; } 
 someArray = jQuery.grep(someArray , function (value) { return value.name != 'Kristian'; }); 

你可以使用array.filter()。

例如

  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.splice(pos, 1); 

投票UndercoreJS简单的工作与数组。

_.without()函数有助于删除一个元素:

  _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4] 

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

它会删除约翰

在你的数组语法中似乎有一个错误,所以假设你的意思是一个数组而不是一个对象, Array.splice是你的朋友在这里:

 someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}]; someArray.splice(1,1) 

最简单的解决scheme是创build一个映射,按照名称存储每个对象的索引,如下所示:

 //adding to array var newPerson = {name:"Kristian", lines:"2,5,10"} someMap[ newPerson.name ] = someArray.length; someArray.push( newPerson ); //deleting from the array var index = someMap[ 'Kristian' ]; someArray.splice( index, 1 ); 

虽然这可能不适合这种情况,但是前些天我发现,如果不需要改变数组的大小,也可以使用delete关键字从数组中删除一个项目,例如

 var myArray = [1,2,3]; delete myArray[1]; console.log(myArray[1]); //undefined console.log(myArray.length); //3 - doesn't actually shrink the array down 

您也可以使用地图function。

 someArray = [{name:"Kristian", lines:"2,5,10"},{name:"John",lines:"1,19,26,96"}]; newArray=[]; someArray.map(function(obj, index){ if(obj.name !== "Kristian"){ newArray.push(obj); } }); someArray = newArray; console.log(someArray); 

你也可以尝试做这样的事情:

 var myArray = [{'name': 'test'}, {'name':'test2'}]; var myObject = {'name': 'test'}; myArray.splice(myArray.indexOf(myObject),1); 

使用javascript的splice()函数。

这可能有所帮助: http : //www.w3schools.com/jsref/jsref_splice.asp

splice(i,1)其中i是数组的增量索引,将删除该对象。 但是记住拼接也会重置数组的长度,所以要注意'undefined'。 使用你的例子,如果你删除了“Kristian”,那么在循环中的下一个执行中,我将是2,但someArray将是1的长度,因此如果你尝试删除“John”,你会得到一个“未定义”的错误。 这种方法虽然不够高雅,但还是有独立的计数器来跟踪要删除的元素的索引。

只返回属性name不是“Kristian”的数组中的对象

 var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; }); 

演示:

  var 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"} ]; var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; }); console.log(noKristianArray); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

你也可以使用some

 someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}]; someArray.some(item => { if(item.name === "Kristian") // Case sensitive, will only remove first instance someArray.splice(someArray.indexOf(item),1) }) 

这个概念使用Kendo网格

 var grid = $("#addNewAllergies").data("kendoGrid"); var selectedItem = SelectedCheckBoxList; for (var i = 0; i < selectedItem.length; i++) { if(selectedItem[i].boolKendoValue==true) { selectedItem.length= 0; } }