使用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; } }