Подтвердить что ты не робот

Удалить объект из массива объектов

У меня есть массив объектов:

[{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]

Как я могу удалить этот элемент {"value":"14","label":"7"}, в результате чего появился новый массив:

 [{"value":"14","label":"7"},{"value":"18","label":"7"}]

?

4b9b3361

Ответ 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);
   }
}

демо

Ответ 2

В 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); });

Ответ 3

Решение с идентификацией

Если у вас есть идентификатор объекта, а не просто равенство объекта (т.е. вы пытаетесь удалить определенный объект из массива, а не только объект, который содержит те же данные, что и существующий объект), вы можете сделать это очень просто с помощью сплайсинга и 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 для использования этого решения.

Ответ 4

Я бы создал новый массив...

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.

Ответ 5

Вот способ сделать это без "создания нового массива" или использования внешних библиотек. Обратите внимание, что это удалит только первый найденный экземпляр, а не дубликаты, как указано в вашем примере вопроса.

// 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);
}

Демо

Ответ 6

Вам нужно сохранить дублированный объект?

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

Ответ 7

Использование подхода ES6:

const objIndex = objs.findIndex(o => o.value === '14' && o.label === '7')

if(objIndex > -1) {
  objs.slice(objIndex, 1)
}