Удалить элемент из массива по значению - PullRequest
9 голосов
/ 16 января 2012

У меня есть массив элементов вроде:

var items = [id: "animal", type: "cat", cute: "yes"]

И я пытаюсь удалить любые элементы, которые соответствуют указанному идентификатору.В этом случае;animal

Я застрял!Я могу легко заставить его работать, имея более простой массив, но это не то, что мне нужно ... Мне также нужно удалять элемент по значению, так как я не хочу, чтобы ссылки на элементы по их индексу были сложными.

Есть ли метод jQuery, который я мог бы использовать, когда мне не нужно перебирать массив элементов, а указывать селектор?

Вот мой jsFiddle: http://jsfiddle.net/zafrX/

Ответы [ 7 ]

22 голосов
/ 16 января 2012

Я не уверен, насколько это сложно - ссылаться на элементы массива по индексу. Стандартный способ удаления элементов массива - метод сращивания

for (var i = 0; i < items.length; i++)
    if (items[i] === "animal") { 
        items.splice(i, 1);
        break;
    }

И, конечно, вы можете обобщить это в вспомогательную функцию, чтобы вам не приходилось дублировать это везде.


EDIT

Я только что заметил этот неправильный синтаксис:

var items = [id: "animal", type: "cat", cute: "yes"]

Вы хотели что-то вроде этого:

 var items = [ {id: "animal",  type: "cat", cute: "yes"}, {id: "mouse",  type: "rodent", cute: "no"}];

Это изменит код удаления на этот:

for (var i = 0; i < items.length; i++)
    if (items[i].id && items[i].id === "animal") { 
        items.splice(i, 1);
        break;
    }
7 голосов
/ 05 октября 2017

Для этого не требуется jQuery или какая-либо сторонняя библиотека, теперь мы можем использовать новый фильтр ES5:

let myArray = [{ id : 'a1', name : 'Rabbit'}, { id : 'a2', name : 'Cat'}];
myArray = myArray.filter(i => i.id !== 'a1');
6 голосов
/ 16 января 2012

Вы можете использовать splice или запустить удаление самостоятельно. Вот пример:

for (var i = 0; i < items.length; i ++) {
    if (items[i] == "animal") { 
        items.splice(i, 1);
        break;
    }
}
2 голосов
/ 16 января 2012

Используя обозначение объекта: http://jsfiddle.net/jrm2k6/zafrX/2/

var animal1 = {id: "animal", type: "cat", cute: "yes"}
var car2 = {id: "car", type: "pick-up", cute: "no"}
var animal3 = {id: "animal", type: "dog", cute: "yes"}
var removeItem = "animal"; // or with the ID matching animal...

var array_items = []
array_items.push(animal1);
array_items.push(car2);
array_items.push(animal3);

for(var i=0;i<array_items.length;i++){
    if(array_items[i].id == removeItem){
        array_items.splice(i,1);
    }
}

//alert(array_items.length);  
2 голосов
/ 16 января 2012

Вы должны сделать это следующим образом (убедитесь, что у вас правильный синтаксис ... у вас не может быть массива со свойствами, но объект внутри {}, а затем вы можете выполнять итерацию по ключам и удалять ненужный ключ):

var items = {id: "animal", type: "cat", cute: "yes"}
var removeItem = "animal"; // or with the ID matching animal...

for(var p in items){
    if(items[p] === removeItem)
        delete items[p]
}

И чтобы ответить на ваш вопрос, вы не можете применить селекторы jquery к объектам javascript.Лучшее, что вы можете сделать, чтобы избежать цикла for, - это использовать $. Каждый (который является циклом, написанным более «функционально»).

1 голос
/ 24 июля 2018

Есть простой способ!

myItems.splice(myItems.indexOf(myItems.find(row => row.id == id)), 1);

Демо ниже:

// define function
function delete_by_id(id) {

  var myItems = [{
    id: 1,
    type: "cat",
    cute: "yes"
  }, {
    id: 2,
    type: "rat",
    cute: "yes"
  }, {
    id: 3,
    type: "mouse",
    cute: "yes"
  }];

  // before
  console.log(myItems);

  myItems.splice(myItems.indexOf(myItems.find(item => item.id == id)), 1);

  // after 
  console.log(myItems);

}

// call function
delete_by_id(1);
0 голосов
/ 07 августа 2014

Ух, так много идей, но все же не то, что я хотел xD

Это удалит ВСЕ записи данного значения и вернет удаленное значение:

function removeOfArray(val, arr){
    var idx;
    var ret;
    while ((idx = arr.indexOf(val)) > -1){
        arr.splice(idx, 1);
        ret = val;
    }
    return ret;
}

Также я нашел другие решенияздесь: Удалить элемент из массива по значению

...