var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
객체 속성을 일치시켜 배열에서 객체를 제거하려면 어떻게합니까?
기본 JavaScript 만 사용하십시오.
삭제 할 때마다 길이가 줄어들 기 때문에 스플 라이스를 사용하는 데 문제가 있습니다. Orignal 인덱스에서 복제 및 스 플라이 싱을 사용하면 여전히 길이가 줄어드는 문제가 있습니다.
답변
나는 당신 splice
이 이와 같은 것을 사용 했다고 가정 합니까?
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) !== -1) {
arrayOfObjects.splice(i, 1);
}
}
버그를 수정하기 위해해야 할 일은 i
다음에 줄어드는 것입니다.
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) !== -1) {
arrayOfObjects.splice(i, 1);
i--;
}
}
선형 시간 삭제를 피하기 위해 배열 위에 유지 하려는 배열 요소를 작성할 수 있습니다 .
var end = 0;
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) === -1) {
arrayOfObjects[end++] = obj;
}
}
arrayOfObjects.length = end;
최신 런타임에서 선형 시간 조회를 피하기 위해 해시 세트를 사용할 수 있습니다.
const setToDelete = new Set(listToDelete);
let end = 0;
for (let i = 0; i < arrayOfObjects.length; i++) {
const obj = arrayOfObjects[i];
if (setToDelete.has(obj.id)) {
arrayOfObjects[end++] = obj;
}
}
arrayOfObjects.length = end;
좋은 기능으로 싸일 수 있습니다.
const filterInPlace = (array, predicate) => {
let end = 0;
for (let i = 0; i < array.length; i++) {
const obj = array[i];
if (predicate(obj)) {
array[end++] = obj;
}
}
array.length = end;
};
const toDelete = new Set(['abc', 'efg']);
const arrayOfObjects = [{id: 'abc', name: 'oh'},
{id: 'efg', name: 'em'},
{id: 'hij', name: 'ge'}];
filterInPlace(arrayOfObjects, obj => !toDelete.has(obj.id));
console.log(arrayOfObjects);
당신이 그 자리에 그것을 할 필요가 없다면, 그것은 Array#filter
:
const toDelete = new Set(['abc', 'efg']);
const newArray = arrayOfObjects.filter(obj => !toDelete.has(obj.id));
답변
다음과 같은 타사 라이브러리를 사용하지 않고 속성 중 하나를 사용하여 항목을 제거 할 수 있습니다.
var removeIndex = array.map(item => item.id)
.indexOf("abc");
~removeIndex && array.splice(removeIndex, 1);
답변
lodash / 밑줄로 :
기존 배열 자체를 수정하려면 splice 를 사용해야 합니다. 다음은 findWhere of underscore / lodash를 사용하는 조금 더 좋고 읽기 쉬운 방법입니다 .
var items= [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'},
{id:'hij',name:'ge'}];
items.splice(_.indexOf(items, _.findWhere(items, { id : "abc"})), 1);
ES5 이상
( lodash / 밑줄없이 )
ES5부터는 findIndex
배열에 메소드가 있으므로 lodash / underscore없이 쉽게 사용할 수 있습니다.
items.splice(items.findIndex(function(i){
return i.id === "abc";
}), 1);
(ES5는 거의 모든 morden 브라우저에서 지원됩니다)
답변
findIndex는 최신 브라우저에서 작동합니다.
var myArr = [{id:'a'},{id:'myid'},{id:'c'}];
var index = arr.findIndex(function(o){
return o.id === 'myid';
})
if (index !== -1) myArr.splice(index, 1);
답변
주어진 배열에서 ID로 객체를 삭제합니다.
const hero = [{'id' : 1, 'name' : 'hero1'}, {'id': 2, 'name' : 'hero2'}];
//remove hero1
const updatedHero = hero.filter(item => item.id !== 1);
답변
기존 배열에서 제거하고 새 배열을 만들지 않으려면 다음을 시도하십시오.
var items = [{Id: 1},{Id: 2},{Id: 3}];
items.splice(_.indexOf(items, _.find(items, function (item) { return item.Id === 2; })), 1);
답변
i
문제점을 피하기 위해 감소 시켜서 역순으로 반복 하십시오.
for (var i = arrayOfObjects.length - 1; i >= 0; i--) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) !== -1) {
arrayOfObjects.splice(i, 1);
}
}
또는 사용 filter
:
var newArray = arrayOfObjects.filter(function(obj) {
return listToDelete.indexOf(obj.id) === -1;
});