UnderscoreJS를 사용하여 배열에서 항목 제거


137

이 코드가 있다고 가정 해보십시오.

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

배열에서 id = 3 인 항목을 제거하고 싶습니다. 접합하지 않고 이것을 수행하는 방법이 있습니까? 밑줄이나 그와 비슷한 것을 사용하여 뭔가를 할 수 있습니까?

감사!


새로운 배열을 생성하지 않으려면 접속이 유일한 선택입니다. 밑줄도 그것을 사용합니다 (그러한 방법이 존재하는 경우 내부적으로).
Felix Kling

6
접합에 어떤 문제가 있습니까?
Šime Vidas

밑줄 참조를 확인 했습니까?
Šime Vidas

일반 JavaScript를 사용하면 객체 속성별로 배열에서 객체제거 하는 복제본입니다 .
Felix Kling

5
이 underscore.js에 대한 태그가로 잘 중복되지 않는다
Garis M Suero에게

답변:


279

일반 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>

어쨌든이 경우 새 배열을 작성하기 때문에 다른 질문에 표시된 것처럼 _.filter또는 기본 Array.prototype.filter기능을 간단히 사용할 수 있습니다 . 그런 다음 여기와 같이 잠재적으로 두 배가 아닌 배열을 한 번만 반복합니다.

배열 을 제자리에서 수정하려면 을 사용해야 .splice합니다. 이것은 다른 질문에도 나와 있으며 undescore는 유용한 기능을 제공하지 않는 것 같습니다.


1
그러나 이것은 완벽하게 작동합니다. 저는 밑줄 문서를 살펴 보았지만없이 가져 오는 방법을 이해하지 못했습니다. 감사합니다!
climboid 2016 년

10
여기서 _.reject 또는 _.filter ()가 훨씬 더 효율적이지 않습니까? 하나의 항목을 꺼내기 위해 목록을 두 번 반복합니다.
Rick Strahl

1
이것은 중복 일 수 있지만 더 좋은 대답입니다.
마이클 J. 칼 킨스

2
@RickStrahl 당신이 맞아요. _.reject더 나은 선택처럼 보입니다.
Tarik

1
@lukaserat 마지막 요소를 팝업, 사용 arr.pop()...
Emile Bergeron

96

밑줄을 사용할 수 있습니다 .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


나는 당신이 의미한다고 생각합니다 : var filters = _.filter (arr, function (item) {return item.id! == 3});
tbh__

2
@tbh__ _()는 컬렉션 주위에 래퍼를 생성하여 밑줄 메서드를 호출 할 수 있습니다.
Sushanth-

몇 년 동안 밑줄을 사용했기 때문에 나는 이것을 전혀 몰랐습니다. 감사합니다
tbh__


16

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.


2
참고 : 이것은 sam 객체를없이 전달하기 때문에 작동합니다. { Name: "Sam", Age: 19 }변수 sam 대신에 전달 하지 않으면 더 이상 작동하지 않습니다. 바이올린
Adam

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

4

배열을 수정하려는 경우 다른 답변으로 배열의 새 복사본을 만듭니다.

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

그러나 요소가 항상 배열 내에서 발견된다고 가정합니다 (발견되지 않으면 여전히 마지막 요소를 제거합니다). 안전을 위해 다음을 사용할 수 있습니다.

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}

2

또는 다른 편리한 방법 :

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

내 2 센트


1
omit 작동 object하고를 반환합니다 object. 따라서 요소를 제거한 후 돌아올 Arrays것으로 예상되는 곳 에서 작업하기에는 좋지 않습니다 array.
ScrapCode

1
따라서 _.without 은 여러분이보고있는 것입니다 : _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem

2

사용 사용할 수 있습니다 일반 자바 스크립트Array#filter다음과 같은 방법을 :

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

var filteredArr = arr.filter(obj => obj.id != 3);

console.log(filteredArr);

또는 다음 Array#reduceArray#concat같은 사용 및 방법 :

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

var reducedArr = arr.reduce((accumulator, currObj) => {
  return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);

console.log(reducedArr);

노트:

  • 둘 다 순수한 기능적 접근 방식입니다 ( , 기존 배열을 수정하지 않음).
  • 아니요, 이러한 접근 방식에는 외부 라이브러리가 필요합니다 (Vanilla JavaScript이면 충분합니다).

0

나는이 방법을 시도했다

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

사용자가 제공 한 위의 솔루션과 같은 더 좋은 방법이있을 수 있습니다


0

underscore.js를 사용하여

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

var resultArr = _.reject(arr,{id:3});

console.log(resultArr);

결과는 :: [{id:1name:'a'},{id:2,name:'c'}]


-1

Underscore의 거부 방법을 사용할 수 있습니다. 아래에서 특정 일치하는 배열이없는 새 배열을 반환합니다.

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.