javascript найти и удалить объект в массиве на основе значения ключа
Я пробовал несколько подходов о том, как найти объект в массиве, где ID = var, и если найдено, удалить объект из массива и вернуть новый массив объектов.
данные:
[
{"id":"88","name":"Lets go testing"},
{"id":"99","name":"Have fun boys and girls"},
{"id":"108","name":"You are awesome!"}
]
Я могу искать массив с помощью jQuery $grep;
var id = 88;
var result = $.grep(data, function(e){
return e.id == id;
});
но как я могу удалить весь объект, когда id = = 88, и возвращать данные следующим образом:
данные:
[
{"id":"99","name":"Have fun boys and girls"},
{"id":"108","name":"You are awesome!"}
]
11 ответов:
Я могу grep массив для id, но как я могу удалить весь объект, где id = = 88
просто фильтровать по противоположному предикату:
var data = $.grep(data, function(e){ return e.id != id; });
вы можете упростить это,и здесь действительно нет необходимости использовать jquery.
var id = 88; for(var i = 0; i < data.length; i++) { if(data[i].id == id) { data.splice(i, 1); break; } }
просто повторите список, найдите соответствующий идентификатор, соедините, а затем разорвите, чтобы выйти из цикла
вот решение, если вы не используете jQuery:
myArray = myArray.filter(function( obj ) { return obj.id !== id; });
есть новый метод для этого в ES6 / 2015 с помощью оператора findindex и array spread:
const index = data.findIndex(obj => obj.id === id); const newData = [ ...data.slice(0, index), ...data.slice(index + 1) ]
вы можете превратить его в функцию для повторного использования, как это:
function remove(array, key, value) { const index = array.findIndex(obj => obj[key] === value); return index >= 0 ? [ ...this.slice(0, index), ...this.slice(index + 1) ] : this; }
таким образом, вы можете удалить элементы с помощью разных ключей, используя один метод (и если нет объекта, который соответствует критериям, вы получаете исходный массив возвращается):
const newData = remove(data, "id", "88"); const newData2 = remove(data, "name", "You are awesome!");
или вы можете поместить его на свой массив.прототип:
Array.prototype.remove = function (key, value) { const index = this.findIndex(obj => obj[key] === value); return index >= 0 ? [ ...this.slice(0, index), ...this.slice(index + 1) ] : this; };
и использовать это образом:
const newData = data.remove("id", "88"); const newData2 = data.remove("name", "You are awesome!");
предполагая, что идентификаторы уникальны, и вам нужно будет удалить только один элемент
splice
следует сделать трюк:var data = [ {"id":"88","name":"Lets go testing"}, {"id":"99","name":"Have fun boys and girls"}, {"id":"108","name":"You are awesome!"} ], id = 88; console.table(data); $.each(data, function(i, el){ if (this.id == id){ data.splice(i, 1); } }); console.table(data);
может быть, вы ищете
$.grep()
функция:arr = [ {"id":"88","name":"Lets go testing"}, {"id":"99","name":"Have fun boys and girls"}, {"id":"108","name":"You are awesome!"} ]; id = 88; arr = $.grep(arr, function(data, index) { return data.id != id });
Array.prototype.removeAt = function(id) { for (var item in this) { if (this[item].id == id) { this.splice(item, 1); return true; } } return false; }
Это должно сделать трюк, jsfiddle
var items = [ {"id":"88","name":"Lets go testing"}, {"id":"99","name":"Have fun boys and girls"}, {"id":"108","name":"You are awesome!"} ];
Если вы используете jQuery, используйте jQuery.грэп такой:
items = $.grep(items, function(item) { return item.id !== '88'; }); // items => [{ id: "99" }, { id: "108" }]
С помощью ES5 массив.прототип.фильтр:
items = items.filter(function(item) { return item.id !== '88'; }); // items => [{ id: "99" }, { id: "108" }]
sift
это мощный фильтр сбора данных для таких операций, как эта и гораздо более продвинутые из них. Он работает на стороне клиента в браузере или на стороне сервера в узле.js.var collection = [ {"id":"88","name":"Lets go testing"}, {"id":"99","name":"Have fun boys and girls"}, {"id":"108","name":"You are awesome!"} ]; var sifted = sift({id: {$not: 88}}, collection);
он поддерживает фильтры, такие как
$in
,$nin
,$exists
,$gte
,$gt
,$lte
,$lt
,$eq
,$ne
,$mod
,$all
,$and
,$or
,$nor
,$not
,$size
,$type
и$regex
, и стремится быть API-совместимым с коллекцией MongoDB фильтрующий.
убедитесь, что вы принуждаете идентификатор объекта к целому числу, если вы проверяете на строгое равенство:
var result = $.grep(data, function(e, i) { return +e.id !== id; });
Если вы используете underscore js, легко удалить объект на основе ключа. http://underscorejs.org. Пример:
var temp1=[{id:1,name:"safeer"}, //temp array {id:2,name:"jon"}, {id:3,name:"James"}, {id:4,name:"deepak"}, {id:5,name:"ajmal"}]; var id = _.pluck(temp1,'id'); //get id array from temp1 var ids=[2,5,10]; //ids to be removed var bool_ids=[]; _.each(ids,function(val){ bool_ids[val]=true; }); _.filter(temp1,function(val){ return !bool_ids[val.id]; });