JavaScript를 사용하여 배열에서 객체 제거


548

배열에서 객체를 제거하려면 어떻게해야합니까? Kristian에서 이름이 포함 된 개체를 제거하고 싶습니다 someArray. 예를 들면 다음과 같습니다.

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

나는 달성하고 싶다 :

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


3
참고 로이 질문에 대한 편집을 롤백하여 배열 구문이 다시 잘못되었으며 이러한 모든 답변이 컨텍스트에 있습니다.
Dunhamzzz

2
그런 다음 배열 구문이 다시 "수정"되어 (두 번) 대답이 더 이상 문맥에 포함되지 않습니다.
Teepeemm

4
구문 오류가 어떤 대답을 이해하는 데 어떻게 도움이됩니까?
Samy Bencherif

1
@SamyBencherif-일부 답변은 질문의 원래 버전에서 구문 오류를 명시 적으로 해결하므로 해당 구문 오류를 제거하면 해당 답변이 존재하지 않는 것에 대해 이야기하고 있습니다.
nnnnnn 1

답변:


778

여러 가지 방법을 사용하여 배열에서 항목을 제거 할 수 있습니다.

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

position x에서 element를 제거 하려면 다음을 사용하십시오.

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

// Note: if you're not sure about the contents of your array, 
// you should check the results of findIndex first
let someArray4 = getArray();
const indx = someArray4.findIndex(v => v.name === "Michael");
someArray4.splice(indx, indx >= 0 ? 1 : 0);
log("", "check findIndex result first > someArray4 (nothing is removed) > ",
  format(someArray4));
log(`**someArray4.length (should still be 3) ${someArray4.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>


2
@ Klemzy 당신은 인덱스가 아닌 것을 의미하지 않습니까? 값으로 ...?
Royi Namir

328
원래 질문은 배열에서 이름이 "Kristian"인 객체를 제거하는 방법을 묻습니다. 귀하의 답변은 그것이 배열의 첫 번째 항목이라고 가정하지만 Kristin이 첫 번째 항목에 없으면 어떻게됩니까? 그런 다음 귀하의 답변이 효과가 없습니다.
Rochelle C

7
@ chill182 : 구체적인 답변은 아니지만보다 일반적인 답변입니다. 그것으로부터 요소를 제거하는 방법을 유추 할 수 있어야합니다. x 위치에서 요소를 제거하려면 ... 첫 번째 요소 이외의 요소를 제거하는 힌트가 될 수 있습니다.
KooiInc

6
splice 함수가 도움이되었지만 someArray를 다시 할당해서는 안됩니다. 이로 인해 제거 된 항목이 포함 된 someArray가 생성되고 항목이 제거 된 결과 배열이 포함됩니다.
Kenn Cal

1
findIndex에서 사용하기 전에 결과를 확인해야합니다 splice. 배열에 조건과 일치하는 요소가 없으면 findIndex이를 반환 -1하고이를 직접 넣으면 splice배열의 마지막 요소가 임의로 삭제됩니다.
jdnz

131

다음 과 같은 일반적인 작업에 lodash.js 또는 sugar.js 를 사용하는 것이 좋습니다 .

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

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

대부분의 프로젝트에서 이와 같은 라이브러리가 제공하는 일련의 도우미 메소드를 갖는 것이 매우 유용합니다.


13
밑줄 예제가 약간 벗어난 것 같습니다. 이어야한다someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });
앤디 포드에게

7
underscore.js 또는 sugar.js를 사용하지 않으려면 다음을 수행하십시오.someArray = someArray.filter(function(e) { return e.Name !== "Kristian"; });
BenR

1
내가 원하는 또 다른 것은 배열의 모든 객체에 대해 별도의 버튼이있을 것입니다. 배열 버튼에서 특정 객체를 삭제하려면 클릭하십시오. 그것을하는 방법. angular js ng-repeat를 사용하여 항목을 생성했습니다. 도와주세요
Thilak Raj

5
여기에 곡식에 대항하려고합니다. 객체에서 항목을 제거하는 간단한 목적을 위해 전체 라이브러리를 포함하는 것이 좋습니다 (정답이 보여 주듯이 js가 즉시 지원합니다). 라이브러리가 제공하는 더 강력한 기능을 위해 코드가 필요하지 않으면 코드에 불필요한 무게와 복잡성을 추가합니다.
Josh Doebbert

4
간단한 조작을 위해, 나는 도서관을 포함하는 것을 권장하지 않을 것입니다
Munna Bhakta

130

깨끗한 해결책은 다음을 사용하는 것입니다 Array.filter.

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

이것의 문제는 IE <9에서 작동하지 않는다는 것 입니다. 그러나 모든 브라우저에서이를 구현 하는 Javascript 라이브러리 (예 : underscore.js )의 코드를 포함 할 수 있습니다 .


10
그러나 이것은 첫 번째 사건뿐만 아니라 발견 된 모든 사건을 제거 할 것입니다
Flavien Volken

4
그리고 원래 배열을 수정하는 대신 새 배열을 반환합니다. 사용 사례에 따라 원하는 것이거나 아닐 수도 있습니다.
Jochie Nabuurs

1
@JochieNabuurs 그것은 실제로 새로운 배열입니다. 그러나 개체는 동일하게 유지됩니다. 여전히 각 객체의 값을 수정할 수 있으며 원래 배열의 객체에 반영됩니다.
DriLLFreAK100

2
새로운 배열을 반환하는 것에 대한 요점으로 솔루션을 someArray = someArray.filter(function(el) { return el.Name != "Kristian"; }); 주소로 변경하면됩니다 .
hBrent

93

이건 어때요?

$.each(someArray, function(i){
    if(someArray[i].name === 'Kristian') {
        someArray.splice(i,1);
        return false;
    }
});

8
$.each()반복하기 전에 배열 길이를 캐시하므로 요소를 제거하면 오류가 발생하지 않습니다.$.each() 하면 (더 짧은) 배열의 끝을지나 실행됩니다. (그럼 someArray[i]undefinedundefined.name충돌합니다.)
NNNNNN

5
그런 다음 스플 라이스 뒤에 'return false'를 추가하십시오.
Allan Taylor

18
이것은 자바 스크립트가 아닙니다. -1
onionpsy

20
이 답변에는 jQuery가 필요합니다.
Clarkey

68

표시된 "배열"이 잘못된 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;
   }

편집 : 당신이 시도 할 수 있도록 그냥, 귀하의 질문에 "jQuery를"로 태그가 발견 $.grep()방법을 .

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

과부하를 추가 한 이유는 무엇입니까? 확실히 당신은 방금! = "Kristian"을 넣을 수있었습니다. 과부하는 어떤 용도로 사용됩니까?
markthewizard1234

@ markthewizard1234-에서 "반전"부울 인수를 의미 $.grep()합니까? 이 예에서는 많이 추가하지 않습니다. 예, 넣을 수는 !=있지만 다른 경우에는 grep하려는 대상과 반대 테스트를 수행하는 함수가 이미 정의되어있을 수 있습니다. 추가 기능을 사용하면 과부하를 사용하여 결과를 반전시킬 수 있습니다.
nnnnnn

아, grep을 포함하는 래퍼 함수가 있으면 부울을 매개 변수로 설정할 수 있습니다. 고마워요!
markthewizard1234

@ markthewizard1234-할 수는 있지만, 내가 생각한 것은 아닙니다 function isEven(num) { return num%2===0 }. 당신이 사용할 수있는 $.grep(someArray, isEven)배열에서 단지 짝수 번호를 얻기 위해, 또는 $.grep(someArray, isEven, true)그 반대를 할과 비에도 값을 얻는다.
nnnnnn

63

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

John 을 제거합니다 !


4
남자 ... 자바에서 왔을 때, 그런 기본적인 작업을 수행하려면 목록 필터링이 필요하다고 혼동합니다. wtf. 이것은 지금까지 읽은 OP 질문에 대한 가장 정확한 답변입니다.
codepleb

예, 이것은 좋은 접근 방법입니다. ES2015 (ES6) 이전에도 작동합니다. 필터 기능은 버전 5.1 (2011)부터 사용 가능합니다. ecma-international.org/ecma-262/5.1/#sec-15.4.4.20
user3777549

40

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

화살표 기능 :

someArray = someArray.filter(x => x.name !== 'Kristian')

내가 원하는 또 다른 것은 배열의 모든 객체에 대해 별도의 버튼이있을 것입니다. 배열 버튼에서 특정 객체를 삭제하려면 클릭하십시오. 그것을하는 방법. angular js ng-repeat를 사용하여 항목을 생성했습니다. 도와주세요
Thilak Raj

daCoda 두 가지 조건이 있으면 어떻게합니까?
말콤 살바도르

@ MalcolmSalvador는 예를 들어 다른 조건이있는 경우 아래와 같이 작성하고 다른 && 또는 || 당신의 필요에 따라 연산자. someArray = someArray.filter (function (returnableObjects) {return returnableObjects.name! == 'Kristian'&& cond2Query.age> = 22;});
Biswajit Panday

18

동적 함수는 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"));

15

이것은 나를 위해 작동하는 기능입니다.

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

내가 원하는 또 다른 것은 배열의 모든 객체에 대해 별도의 버튼이있을 것입니다. 배열 버튼에서 특정 객체를 삭제하려면 클릭하십시오. 그것을하는 방법. angular js ng-repeat를 사용하여 항목을 생성했습니다. 도와주세요
Thilak Raj

12

다음과 같은 작업을 시도해 볼 수도 있습니다.

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


10

배열에 스플 라이스 기능을 사용하십시오. 시작 요소의 위치와 제거 할 서브 시퀀스의 길이를 지정하십시오.

someArray.splice(pos, 1);

8

UndercoreJS에 투표배열에 대한 간단한 작업 에 .

_.without () 함수는 요소를 제거하는 데 도움이됩니다.

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

최고의 솔루션. 객체 배열과 함께 작동합니다.
Azee

4

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

3

가장 간단한 해결책은 다음과 같이 이름별로 각 객체의 인덱스를 저장하는 맵을 만드는 것입니다.

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

나는이 아이디어를 좋아하지만, 색인이 추가 될 때 이와 같은 아이디어에 대한 메모리 사용 제한은 무엇입니까? 객체의 2 개의 다른 필드에서 색인을 생성하려는 배열이 있으므로 원래 소스 배열 외에도 2 개의 맵이 있습니다. 조회 속도를 낮추기위한 저렴한 가격입니까, 아니면 메모리를 효율적으로 사용할 수있는 솔루션이 있습니까?
Brad G.

3

이것은 아마도이 상황에 적합하지는 않지만 다른 날 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

3

이 답변

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

대신.


2

배열 구문에 오류가있는 것 같습니다. 객체가 아닌 배열을 의미한다고 가정하면 Array.splice 는 당신의 친구입니다.

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

2

지도 기능도 사용할 수 있습니다 .

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
그러나 배열을 반복하려면 forEach를 사용하는 것이 낫지 않습니까?
corse32

2

당신은 또한 사용할 수 있습니다 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) 
})

2

이것이 내가 사용하는 것입니다.

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

3 대신 숫자를 바꾸십시오. 예상되는 결과는 다음과 같아야합니다.

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

2

주어진 객체의 모든 발생을 제거하려면 (일부 조건에 따라) for 루프 내부에 javascript splice 메소드를 사용하십시오.

객체를 제거하면 배열 길이에 영향을 미치므로 카운터 검사를 한 단계 씩 줄여 길이 확인이 그대로 유지되도록하십시오.

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보다 큰 모든 객체를 제거합니다.



1

splice (i, 1) 여기서 i는 배열의 증분 인덱스이며 객체를 제거합니다. 그러나 스플 라이스는 배열 길이를 재설정하므로 '정의되지 않음'에주의하십시오. 예제를 사용하여 'Kristian'을 제거하면 루프 내에서 다음 실행에서 2가되지만 someArray의 길이는 1이되므로 "John"을 제거하려고하면 "정의되지 않은"오류가 발생합니다 . 우아하지는 않지만 이것에 대한 한 가지 해결책은 제거 할 요소의 색인을 추적하기 위해 별도의 카운터를 갖는 것입니다.


1

속성 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>


0

이 개념은 검도 그리드를 사용하여

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

var selectedItem = SelectedCheckBoxList;

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

0

나는 대답이 매우 분기되고 매듭되어 있다고 생각합니다.

다음 경로를 사용하여 최신 JavaScript 전문 용어에 제공된 객체와 일치하는 배열 객체를 제거 할 수 있습니다.


coordinates = [
    { lat: 36.779098444109145, lng: 34.57202827508546 },
    { lat: 36.778754712956506, lng: 34.56898128564454 },
    { lat: 36.777414146732426, lng: 34.57179224069215 }
];

coordinate = { lat: 36.779098444109145, lng: 34.57202827508546 };

removeCoordinate(coordinate: object) {
  const found = this.coordinates.find((obj) => obj === obj);
  if (found) {
    this.coordinates.splice(found, 1);
  }
}

this.removeCoordinate(coordinate);

-2

배열의 객체에 액세스하고 제거하려면 다음과 같이 시도하면됩니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.