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

Как удалить объект из массива? Я хочу удалить объект, который включает в себя имя Kristian from someArray. Например:

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

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

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

Ответ 1

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

//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 (см. MDN), например

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"},
             {name:"Brian",lines:"3,9,62,36" }];
johnRemoved = someArray.filter( el => el.name !== "John" );

console.log(JSON.stringify(johnRemoved, null, ' '));

Ответ 2

Я рекомендую использовать 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"; });

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

Ответ 3

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

$.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"}];

В этом случае вы можете использовать метод .splice() для удаления элемента. Чтобы удалить первый элемент (индекс 0), скажем:

someArray.splice(0,1);

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

Если вы не знаете индекс, но хотите найти в массиве, чтобы найти элемент с именем "Kristian", чтобы удалить, вы могли бы:

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

EDIT: Я только заметил, что ваш вопрос помечен как "jQuery", поэтому вы можете попробовать метод $.grep():

someArray = $.grep(someArray,
                   function(o,i) { return o.name === "Kristian"; },
                   true);

Ответ 5

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

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

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

Ответ 6

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');

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

Ответ 7

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

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

        }

Полный пример: DEMO

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

Ответ 8

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

function removeFromArray(array, value) {
    var idx = array.indexOf(value);
    if (idx !== -1) {
        array.splice(idx, 1);
    }
    return array;
}

Ответ 9

someArray = jQuery.grep(someArray , function (value) {
        return value.name != 'Kristian';
});

Ответ 10

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

например

        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"}];

Ответ 11

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

someArray.splice(pos, 1);

Ответ 12

Проголосуйте за UndercoreJS за простую работу с массивами.

Функция _.without() помогает удалить элемент:

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

Ответ 13

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

var myArray = [{'name': 'test'}, {'name':'test2'}];
var myObject = {'name': 'test'};
myArray.splice(myArray.indexOf(myObject),1);

Ответ 14

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

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

Ответ 15

С функцией ES 6 arrow

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)

Ответ 16

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

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

Ответ 17

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

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

Ответ 18

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

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

Ответ 20

splice (i, 1), где я - инкрементный индекс массива, удалит объект. Но помните, что сплайсинг также сбросит длину массива, поэтому следите за "неопределенным". Используя ваш пример, если вы удалите "Kristian", то в следующем выполнении в цикле я будет 2, а someArray будет длиной 1, поэтому, если вы попытаетесь удалить "Джон", вы получите сообщение об ошибке "undefined", Одним из решений этого, хотя и не изящного, является наличие отдельного счетчика для отслеживания индекса элемента, который нужно удалить.

Ответ 21

Возвращает только объекты из массива, name свойства которого не является "Kristian"

var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });


Демо - версия:

 var 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"}
                ];
			 
var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });

console.log(noKristianArray);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ответ 22

Это то, что я использую.

Array.prototype.delete = function(pos){
    this[pos] = undefined;
    var len = this.length - 1;
    for(var a = pos;a < this.length - 1;a++){
      this[a] = this[a+1];
    }
    this.pop();
  }

Тогда это так же просто, как сказать

var myArray = [1,2,3,4,5,6,7,8,9];
myArray.delete(3);

Замените любое число вместо трех. После ожидаемого выхода:

console.log(myArray); //Expected output 1,2,3,5,6,7,8,9

Ответ 23

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

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

someArray.some(item => { 
    if(item.name === "Kristian") // Case sensitive, will only remove first instance
        someArray.splice(someArray.indexOf(item),1) 
})

Ответ 24

Эта концепция использует Kendo Grid

var grid = $("#addNewAllergies").data("kendoGrid");

var selectedItem = SelectedCheckBoxList;

for (var i = 0; i < selectedItem.length; i++) {
    if(selectedItem[i].boolKendoValue==true)
    {
        selectedItem.length= 0;
    }
}

Ответ 25

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

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

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.

Ответ 26

Этот ответ

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

не работает для нескольких записей, выполняющих условие !!! Если у вас есть две такие последовательные записи, удаляется только первая, а другая - пропущена. Вы должны использовать: for (var я = someArray.length - 1; i> = 0; i--)... вместо

Ответ 27

Если вы хотите получить доступ к объекту массива и удалить его, просто вы можете попробовать что-то вроде этого.

// inside some function

let someArray = [ {"ColumnName" : "a", "PropertySerno" : 100005,"UpdateType" : 1},
                  {"ColumnName" : "b", "PropertySerno" : 100202,"UpdateType" : 1,
        "ShowRemoveButton" : true} ];
        
        for (let item of someArray) {
          delete item.ShowRemoveButton;
        }
        console.log(item.outputMappingData.Data);
        
//output will be like that = [ {"ColumnName" : "a", "PropertySerno" : 100005,"UpdateType" : 1},
//                             {"ColumnName" : "b", "PropertySerno" : 100202,"UpdateType" : 1 }];