Удаление объекта из массива с помощью JavaScript

Как удалить объект из массива? Я хочу удалить объект с именем Kristian из массива SomeArray. Например:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

Я хочу добиться:

someArray = [{name:"John", lines:"1,19,26,96"}];
Комментарии к вопросу (5)
Решение

Вы можете использовать несколько методов для удаления элемента (элементов) из массива:

//1
someArray.shift(); // first element removed
//2
someArray = someArray.slice(1); // first element removed
//3
someArray.splice(0, 1); // first element removed
//4
someArray.pop(); // last element removed
//5
someArray = someArray.slice(0, a.length - 1); // last element removed
//6
someArray.length = someArray.length - 1; // last element removed

Если вы хотите удалить элемент в позиции x, используйте:

someArray.splice(x, 1);

Или

someArray = someArray.slice(0, x).concat(someArray.slice(-x));

Ответ на комментарий от @chill182: вы можете удалить один или несколько элементов из массива с помощью Array.filter, или Array.splice в сочетании с Array.findIndex (см. MDN), например.

// non destructive filter > noJohn = John removed, but someArray will not change
let someArray = getArray();
let noJohn = someArray.filter( el => el.name !== "John" ); 
log("non destructive filter > noJohn = ", format(noJohn));
log(`**someArray.length ${someArray.length}`);

// destructive filter/reassign John removed > someArray2 =
let someArray2 = getArray();
someArray2 = someArray2.filter( el => el.name !== "John" );
log("", "destructive filter/reassign John removed > someArray2 =", 
  format(someArray2));
log(`**someArray2.length ${someArray2.length}`);

// destructive splice /w findIndex Brian remains > someArray3 =
let someArray3 = getArray();
someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1);
someArray3.splice(someArray3.findIndex(v => v.name === "John"), 1);
log("", "destructive splice /w findIndex Brian remains > someArray3 =", 
  format(someArray3));
log(`**someArray3.length ${someArray3.length}`);

function format(obj) {
  return JSON.stringify(obj, null, " ");
}

function log(...txt) {
  document.querySelector("pre").textContent += `${txt.join("\n")}\n`
}

function getArray() {
  return [ {name: "Kristian", lines: "2,5,10"},
           {name: "John", lines: "1,19,26,96"},
           {name: "Brian", lines: "3,9,62,36"} ];
}
<pre>
**Results**

</pre>
Комментарии (8)

Я рекомендую использовать underscore.js или sugar.js для общей задачи:

// underscore.js
someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });

// sugar.js
someArray.remove(function(el) { return el.Name === "Kristian"; });

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

Комментарии (9)

Чистым решением было бы использование Array.filter:

var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; }); 

Проблема в том, что он не работает на IE < 9. Однако вы можете включить код из библиотеки Javascript (например, underscore.js), который реализует это для любого браузера.

Комментарии (4)

Как насчет этого?

$.each(someArray, function(i){
    if(someArray[i].name === 'Kristian') {
        someArray.splice(i,1);
        return false;
    }
});
Комментарии (4)

Вашу "массив" и как показали недопустимый синтаксис JavaScript. Фигурные скобки {} для объектов с пары имени и значения свойства, но квадратные скобки [] для массивов - вот так:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];

В этом случае, вы можете использовать [.соединения (метод)] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice), чтобы удалить элемент. Чтобы удалить первый элемент (индекс 0), сказать:

someArray.splice(0,1);

// someArray = [{name:"John", lines:"1,19,26,96"}];

Если вы Don'т знаю индекса, но для поиска по массиву, чтобы найти элемент с именем "Кристиан", чтобы удалить можно так:

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

Редактировать: я просто заметил, что ваш вопрос помечен с "помощью jQuery" и, таким образом, вы могли бы попробовать $.команда grep() метод:

someArray = $.grep(someArray,
                   function(o,i) { return o.name === "Kristian"; },
                   true);
Комментарии (4)

ES2015

let someArray = [
               {name:"Kristian", lines:"2,5,10"},
               {name:"John", lines:"1,19,26,96"},
               {name:"Kristian", lines:"2,58,160"},
               {name:"Felix", lines:"1,19,26,96"}
            ];

someArray = someArray.filter(person => person.name != 'John');

Он будет удалить Джон!

Комментарии (2)

Вы могли бы использовать массив.фильтр().

например

        someArray = [{name:"Kristian", lines:"2,5,10"},
                     {name:"John", lines:"1,19,26,96"}];

        someArray = someArray.filter(function(returnableObjects){
               return returnableObjects.name !== 'Kristian';
        });

        //someArray will now be = [{name:"John", lines:"1,19,26,96"}];

Стрелочные функции:

someArray = someArray.filter(x => x.name !== 'Kristian')
Комментарии (2)

Я сделал динамический функция принимает массив объектов, ключ и значение и возвращает тот же массив после удаления нужного объекта:

function removeFunction (myObjects,prop,valu)
        {
             return myObjects.filter(function (val) {
              return val[prop] !== valu;
          });

        }

Полный пример: [демо][1]

var obj = {
            "results": [
              {
                  "id": "460",
                  "name": "Widget 1",
                  "loc": "Shed"
              }, {
                  "id": "461",
                  "name": "Widget 2",
                  "loc": "Kitchen"
              }, {
                  "id": "462",
                  "name": "Widget 3",
                  "loc": "bath"
              }
            ]
            };

        function removeFunction (myObjects,prop,valu)
        {
             return myObjects.filter(function (val) {
              return val[prop] !== valu;
          });

        }

console.log(removeFunction(obj.results,"id","460"));
Комментарии (1)

Это функция, которая работает для меня:

function removeFromArray(array, value) {
    var idx = array.indexOf(value);
    if (idx !== -1) {
        array.splice(idx, 1);
    }
    return array;
}
Комментарии (1)
someArray = jQuery.grep(someArray , function (value) {
        return value.name != 'Kristian';
});
Комментарии (0)

Вы также можете попробовать что-то вроде этого:

var myArray = [{'name': 'test'}, {'name':'test2'}];
var myObject = {'name': 'test'};
myArray.splice(myArray.indexOf(myObject),1);
Комментарии (0)

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

someArray.splice(pos, 1);
Комментарии (0)

Голосовать за UndercoreJS для простой работы с массивами.

[_.без()][2] функция помогает удалить элемент:

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
    => [2, 3, 4]

[2]: http://underscorejs.org/#without и"_.без усилителя; amp;#40;)"и

Комментарии (1)

С функцией Эс 6 стрелка

let someArray = [
                 {name:"Kristian", lines:"2,5,10"},
                 {name:"John", lines:"1,19,26,96"}
                ];
let arrayToRemove={name:"Kristian", lines:"2,5,10"};
someArray=someArray.filter((e)=>e.name !=arrayToRemove.name && e.lines!= arrayToRemove.lines)
Комментарии (0)

Хотя это, наверное, не подходит для этой ситуации я узнала на днях, что вы можете также использовать "удалить" ключевое слово, чтобы удалить элемент из массива, если вы Don'т необходимости изменить размер массива, например

var myArray = [1,2,3];

delete myArray[1];

console.log(myArray[1]); //undefined

console.log(myArray.length); //3 - doesn't actually shrink the array down
Комментарии (0)

Этот ответ

for (var i =0; i < someArray.length; i++)
   if (someArray[i].name === "Kristian") {
      someArray.splice(i,1);
   }

не работает для нескольких записей выполнению условия. Если у вас есть два таких последовательных записей, только первые один удаляется, а другой пропущен. Вы должны использовать:

for (var i = someArray.length - 1; i>= 0; i--)
   ...

вместо .

Комментарии (0)

Простым решением было бы создать карту, которая хранит индексы для каждого объекта по имени, как это:

//adding to array
var newPerson = {name:"Kristian", lines:"2,5,10"}
someMap[ newPerson.name ] = someArray.length;
someArray.push( newPerson );

//deleting from the array
var index = someMap[ 'Kristian' ];
someArray.splice( index, 1 );
Комментарии (1)

Там, кажется, ошибка в вашем синтаксисе массива так полагаю вы имеете в виду массив, в отличие от объекта, массив.соединения является вашим другом здесь:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];
someArray.splice(1,1)
Комментарии (0)

Вы можете использовать Карта функция.

someArray = [{name:"Kristian", lines:"2,5,10"},{name:"John",lines:"1,19,26,96"}];
newArray=[];
someArray.map(function(obj, index){
    if(obj.name !== "Kristian"){
       newArray.push(obj);
    }
});
someArray = newArray;
console.log(someArray);
Комментарии (1)

Если вы хотите удалить все вхождения заданного объекта (в зависимости от некоторого условия), то используйте способ соединения JavaScript-код внутри цикла.

С удалением объекта не влияет на длину массива, убедитесь, чтобы уменьшить счетчик на один шаг, так что проверить длина остается неизменной.

var objArr=[{Name:"Alex", Age:62},
  {Name:"Robert", Age:18},
  {Name:"Prince", Age:28},
  {Name:"Cesar", Age:38},
  {Name:"Sam", Age:42},
  {Name:"David", Age:52}
];

for(var i = 0;i < objArr.length; i ++)
{
  if(objArr[i].Age > 20)
  {
    objArr.splice(i, 1);
    i--;  //re-adjust the counter.
  }
}

Приведенный выше фрагмент кода удаляет все объекты с возрастом свыше 20.

Комментарии (0)