Удалить элемент массива на основе свойства объекта
У меня есть массив таких объектов:
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
Как удалить конкретный объект на основе его свойства?
например. Как удалить объект массива с помощью "денег" как свойства поля?
Ответы
Ответ 1
Одна возможность:
myArray = myArray.filter(function( obj ) {
return obj.field !== 'money';
});
Обратите внимание, что filter
создает новый массив. Любые другие переменные, относящиеся к исходному массиву, не будут получать отфильтрованные данные, хотя вы обновляете исходную переменную myArray
с помощью новой ссылки. Используйте с осторожностью.
Ответ 2
Итерируйте по массиву и splice
те, которые вам не нужны. Для более легкого использования итерируйте в обратном порядке, чтобы вам не приходилось учитывать динамический характер массива:
for (var i = myArray.length - 1; i >= 0; --i) {
if (myArray[i].field == "money") {
myArray.splice(i,1);
}
}
Ответ 3
Скажем, вы хотите удалить второй объект по его свойству field.
С ES6 это так просто.
myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
Ответ 4
Вы можете использовать lodash findIndex, чтобы получить индекс конкретного элемента, а затем соединить его.
myArray.splice(_.findIndex(myArray, function(item) {
return item.value === 'money';
}), 1);
Обновить
Вы также можете использовать ES6 findIndex()
Метод findIndex() возвращает индекс первого элемента в массиве, который удовлетворяет предоставленной функции тестирования. В противном случае возвращается -1.
myArray.splice(myArray.findIndex(myArray, function(item) {
return item.value === 'money';
}), 1);
Ответ 5
Вот еще один вариант с использованием jQuery grep. Pass true
в качестве третьего параметра, чтобы grep удалял элементы, соответствующие вашей функции.
users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
Если вы уже используете jQuery, тогда не требуется прокладка, которая может быть полезна в отличие от использования Array.filter
.
Ответ 6
Ниже приведен код, если вы не используете jQuery. Демо
var myArray = [
{field: 'id', operator: 'eq', value: 'id'},
{field: 'cStatus', operator: 'eq', value: 'cStatus'},
{field: 'money', operator: 'eq', value: 'money'}
];
alert(myArray.length);
for(var i=0 ; i<myArray.length; i++)
{
if(myArray[i].value=='money')
myArray.splice(i);
}
alert(myArray.length);
Вы также можете использовать библиотеку подчёркивания, в которой есть много функций.
Underscore - это библиотека с пояснительной лентой для JavaScript, которая обеспечивает много поддержки функционального программирования
Ответ 7
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
console.log(myArray.length); //3
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true);
console.log(myArray.length); //2
Элемент - это объект в массиве.
Третий параметр true
означает, что вернет массив элементов, который не выполняет вашу логику функций, false
означает, что вернет массив элементов, который не выполняет вашу функциональную логику.
Ответ 8
Использование библиотеки lodash:
var myArray = [
{field: 'id', operator: 'eq', value: 'id'},
{field: 'cStatus', operator: 'eq', value: 'cStatus'},
{field: 'money', operator: 'eq', value: 'money'}
];
var newArray = _.remove(myArray, function(n) {
return n.value === 'money';;
});
console.log('Array');
console.log(myArray);
console.log('New Array');
console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>
Ответ 9
Решение jAndy, вероятно, лучше всего, но если вы не можете полагаться на фильтр, вы можете сделать что-то вроде:
var myArray = [
{field: 'id', operator: 'eq', value: 'id'},
{field: 'cStatus', operator: 'eq', value: 'cStatus'},
{field: 'money', operator: 'eq', value: "money"}
];
myArray.remove_key = function(key){
var i = 0,
keyval = null;
for( ; i < this.length; i++){
if(this[i].field == key){
keyval = this.splice(i, 1);
break;
}
}
return keyval;
}
Ответ 10
На основании приведенных выше комментариев приведен код удаления объекта на основе имени ключа и значения ключа.
var items = [
{ "id": 3.1, "name": "test 3.1"},
{ "id": 22, "name": "test 3.1" },
{ "id": 23, "name": "changed test 23" }
]
function removeByKey(array, params){
array.some(function(item, index) {
return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false;
});
return array;
}
var removed = removeByKey(items, {
key: 'id',
value: 23
});
console.log(removed);