Удалить элемент из массива с помощью UnderscoreJS

Скажем, у меня есть этот код

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

и я хочу удалить элемент с id = 3 из массива. Есть ли способ сделать это без сращивания? Майе что-то с помощью подчеркивания или что-то в этом роде?

Спасибо!

Ответ 1

Просто используя простой JavaScript, на это уже был дан ответ: удалить объекты из массива по свойству объекта.

Используя underscore.js, вы можете комбинировать .findWhere с .without:

var arr = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];

//substract third
arr = _.without(arr, _.findWhere(arr, {
  id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Ответ 2

Вы можете использовать Underscore .filter

    var arr = [{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }, {
      id: 3,
      name: 'c'
    }];

    var filtered = _(arr).filter(function(item) {
         return item.id !== 3
    });

Также может быть записан как:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

Проверить скрипт

Вы также можете использовать .reject

Ответ 3

Использовать Underscore _.reject():

arr = _.reject(arr, function(d){ return d.id === 3; });

Ответ 4

Underscore имеет метод _without(), который идеально подходит для удаления элемента из массива, особенно если у вас есть объект для удаления.

Возвращает копию массива со всеми экземплярами удаленных значений.

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

Работает с более сложными объектами.

var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };

var people = [bob, sam, fred]

_.without(people, sam);

=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];

Если у вас нет элемента для удаления, просто его свойство, вы можете использовать _.findWhere, а затем _.without.

Ответ 5

Будьте внимательны, если вы фильтруете строки и ищете фильтры, нечувствительные к регистру. _.without() чувствителен к регистру. Вы также можете использовать _.reject(), как показано ниже.

var arr = ["test","test1","test2"];

var filtered = _.filter(arr, function(arrItem) {
    return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]

var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]

var filtered2 = _.reject(arr, function(arrItem){ 
    return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]

Ответ 6

arr.splice(_.findIndex(arr, { id: 3 }), 1);

Ответ 7

или другой удобный способ:

_.omit(arr, _.findWhere(arr, {id: 3}));

мои 2 цента

Ответ 8

Я использовал этот метод

_.filter(data, function(d) { return d.name != 'a' });

Там могут быть и более эффективные методы, подобные вышеупомянутым решениям, предоставляемым пользователями

Ответ 9

Вы можете использовать метод отклонения Underscore, ниже будет возвращен новый массив, у которого не будет массив с определенным соответствием

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });