Ответ 1
Try:
var ar = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];
for(var i=0; i < ar.length; i++) {
if(ar[i].value == "14" && ar[i].label == "7")
{
ar.splice(i,1);
}
}
У меня есть массив объектов:
[{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
Как я могу удалить этот элемент {"value":"14","label":"7"}
, в результате чего появился новый массив:
[{"value":"14","label":"7"},{"value":"18","label":"7"}]
?
Try:
var ar = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];
for(var i=0; i < ar.length; i++) {
if(ar[i].value == "14" && ar[i].label == "7")
{
ar.splice(i,1);
}
}
В ES6 (или с помощью es6-shim) вы можете использовать Array.prototype.findIndex вместе с Array.prototype.splice:
arr.splice(arr.findIndex(matchesEl), 1);
function matchesEl(el) {
return el.value === '14' && el.label === '7';
}
Или, если копия массива в порядке (и доступна с ES5), Array.prototype.filter способ:
var withoutEl = arr.filter(function (el) { return !matchesEl(el); });
Если у вас есть идентификатор объекта, а не просто равенство объекта (т.е. вы пытаетесь удалить определенный объект из массива, а не только объект, который содержит те же данные, что и существующий объект), вы можете сделать это очень просто с помощью сплайсинга и IndexOf:
a = {x:1}
b = {x:2}
arr = [a,b]
Предположим, вы хотите удалить b:
arr.splice(
arr.indexOf(b), 1
);
Вопрос неясен, имеем ли мы дело с идентичностью или равенством. Если у вас есть равенство (два объекта, содержащие один и тот же материал, которые выглядят одинаково, но не являются фактически одним и тем же объектом), вам понадобится небольшая функция сравнения, которую мы можем передать findIndex.
a = {x: 1};
b = {x: 2};
arr = [a, b];
Теперь мы хотим удалить c, который равен, но не то же самое, что:
c = {x: 1}
arr.splice(
arr.findIndex(
(i) => i.x === c.x
), 1
);
Обратите внимание, что я передаю функцию лямбда стиля ES6 здесь как первый параметр findIndex.
Если у вас нет роскоши писать только для вечнозеленых браузеров, вы, вероятно, захотите использовать транспилер вроде Babel для использования этого решения.
Я бы создал новый массив...
var original = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
var result = [];
for (var i = 0, l = original.length; i < l; i++) { // Traverse the whole array
var current = original[i];
if (! (current.value == 14 && current.label == 7) ) {
// It doesn't match the criteria, so add it to result
result.push( current );
}
}
Изменить: я еще раз прочитал ваш вопрос. Вы хотите удалить только первый элемент? Затем используйте slice
, чтобы получить только часть массива.
var result = original.slice(1, original.length)
или splice
original.splice(0,1); // Remove one element from index 0.
Вот способ сделать это без "создания нового массива" или использования внешних библиотек. Обратите внимание, что это удалит только первый найденный экземпляр, а не дубликаты, как указано в вашем примере вопроса.
// Array to search
var arr = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];
// Object to remove from arr
var remove = {"value":"14","label":"7"};
// Function to determine if two objects are equal by comparing
// their value and label properties
var isEqual = function(o1, o2) {
return o1 === o2 ||
(o1 != null && o2 != null &&
o1.value === o2.value &&
o1.label === o2.label);
};
// Iterate through array and determine if remove is in arr
var found = false;
var i;
for(i = 0; i < arr.length; ++i) {
if(isEqual(arr[i], remove)) {
found = true;
break;
}
}
if(found) {
// Found remove in arr, remove it
arr.splice(i, 1);
}
Вам нужно сохранить дублированный объект?
С underscoreJS
var oldarray = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
var newarray = _.reject(oldarray, function(o) {
return o == {"value":"14","label":"7"};
});
Использование подхода ES6:
const objIndex = objs.findIndex(o => o.value === '14' && o.label === '7')
if(objIndex > -1) {
objs.slice(objIndex, 1)
}