IT

JavaScript의 키 값을 기반으로 어레이 내의 객체 검색 및 삭제

itgroup 2022. 11. 7. 21:29
반응형

JavaScript의 키 값을 기반으로 어레이 내의 객체 검색 및 삭제

배열에서 개체를 찾는 방법에 대해 몇 가지 방법을 시도했습니다. ID = var입니다. 찾은 경우 해당 개체를 배열에서 제거하고 새 개체 배열을 반환합니다.

데이터:

[
    {"id":"88","name":"Lets go testing"},
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
]

jQuery $grep를 사용하여 어레이를 검색할 수 있습니다.

var id = 88;

var result = $.grep(data, function(e){
     return e.id == id;
});

그러나 ID == 88일 때 개체 전체를 삭제하고 다음과 같이 데이터를 반환하려면 어떻게 해야 합니까?

데이터:

[
    {"id":"99", "name":"Have fun boys and girls"},
    {"id":"108", "name":"You are awesome!"}
]

jQuery를 사용하지 않는 경우의 해결 방법은 다음과 같습니다.

myArray = myArray.filter(function( obj ) {
  return obj.id !== id;
});

ID에 대해 어레이를 GREP할 수 있지만 id == 88인 개체 전체를 삭제하려면 어떻게 해야 합니까?

반대 술어로 간단히 필터링:

var data = $.grep(data, function(e){ 
     return e.id != id; 
});

이를 단순화할 수 있으므로 여기서 jQuery를 사용할 필요가 없습니다.

var id = 88;

for(var i = 0; i < data.length; i++) {
    if(data[i].id == id) {
        data.splice(i, 1);
        break;
    }
}

목록을 반복하고 일치하는 ID를 찾은 다음 중단하면 루프가 종료됩니다.

ES6/2015에는 findIndex와 어레이 확산 연산자를 사용하여 이를 수행하는 새로운 방법이 있습니다.

const index = data.findIndex(obj => obj.id === id);
const newData = [
    ...data.slice(0, index),
    ...data.slice(index + 1)
]

다음과 같이 나중에 재사용할 수 있는 기능으로 전환할 수 있습니다.

function remove(array, key, value) {
    const index = array.findIndex(obj => obj[key] === value);
    return index >= 0 ? [
        ...array.slice(0, index),
        ...array.slice(index + 1)
    ] : array;
}

이렇게 하면 한 가지 방법을 사용하여 다른 키를 사용하여 항목을 제거할 수 있습니다(기준에 부합하는 개체가 없으면 원래 배열이 반환됩니다).

const newData = remove(data, "id", "88");
const newData2 = remove(data, "name", "You are awesome!");

또는 Array.protype:

Array.prototype.remove = function (key, value) {
    const index = this.findIndex(obj => obj[key] === value);
    return index >= 0 ? [
        ...this.slice(0, index),
        ...this.slice(index + 1)
    ] : this;
};

그리고 다음과 같이 사용합니다.

const newData = data.remove("id", "88");
const newData2 = data.remove("name", "You are awesome!");
var items = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
];

jQuery를 사용하는 경우 다음과 같이 jQuery.grep를 사용합니다.

items = $.grep(items, function(item) { 
  return item.id !== '88';
});
// items => [{ id: "99" }, { id: "108" }]

ES5 Array.protype을 사용합니다.필터:

items = items.filter(function(item) { 
  return item.id !== '88'; 
});
// items => [{ id: "99" }, { id: "108" }]

splice과가있있 있있있다다

var data = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
],
id = 88;

console.table(data);

$.each(data, function(i, el){
  if (this.id == id){
    data.splice(i, 1);
  }
});

console.table(data);

ES6 네이티브 솔루션:

const pos = data.findIndex(el => el.id === ID_TO_REMOVE);
if (pos >= 0)
    data.splice(pos, 1);

요소가 배열에 확실히 존재하는 경우:

data.splice(data.findIndex(el => el.id === ID_TO_REMOVE), 1);

프로토타입:

Array.prototype.removeByProp = function(prop,val) {
    const pos = this.findIndex(x => x[prop] === val);
    if (pos >= 0)
        return this.splice(pos, 1);
};

// usage:
ar.removeByProp('id', ID_TO_REMOVE);

http://jsfiddle.net/oriadam/72kgprw5/

참고: 그러면 항목이 제거됩니다.어레이가 는, 「」를 사용해 .filter이전 답변에서 언급한 바와 같이

const data = [
    {"id":"88","name":"Lets go testing"},
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
];

여기서 ID 값이 "88"인 개체의 인덱스를 가져옵니다.

const index = data.findIndex(item => item.id === "88");
console.log(index); // 0

데이터 배열에서 지정된 개체를 제거하기 위해 스플라이스 함수를 사용합니다.

data.splice(index,1);
console.log(data); // [{"id":"99","name":"Have fun boys and girls"},{"id":"108","name":"You are awesome!"}]

아마도 당신은 찾고 있을 것이다.$.grep()★★★★

arr = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
];

id = 88;
arr = $.grep(arr, function(data, index) {
   return data.id != id
});
Array.prototype.removeAt = function(id) {
    for (var item in this) {
        if (this[item].id == id) {
            this.splice(item, 1);
            return true;
        }
    }
    return false;
}

이거면 될 거야, jsfiddle

sift 이러한 작업 및 훨씬 더 고도의 작업을 위한 강력한 수집 필터입니다.브라우저의 클라이언트 측 또는 Node.js의 서버 측으로 동작합니다.

var collection = [
    {"id":"88",  "name":"Lets go testing"},
    {"id":"99",  "name":"Have fun boys and girls"},
    {"id":"108", "name":"You are awesome!"}
];
var sifted = sift({id: {$not: 88}}, collection);

다음과 같은 필터를 지원합니다.$in,$nin,$exists,$gte,$gt,$lte,$lt,$eq,$ne,$mod,$all,$and,$or,$nor,$not,$size,$type , , , , 입니다.$regexMongoDB 컬렉션필터링과 API 호환성을 추구합니다.

앞의 답변에 동의합니다.id로 객체를 찾아 삭제하는 간단한 방법은 다음과 같습니다.

var obj = JSON.parse(data);
var newObj = obj.filter(item => item.Id != 88);

완전 동일성을 테스트하는 경우 오브젝트 ID를 정수로 강제합니다.

var result = $.grep(data, function(e, i) { 
  return +e.id !== id;
});

데모

Underscore.js를 사용하는 경우 키를 기반으로 개체를 쉽게 제거할 수 있습니다.

예를 들어:

  var temp1=[{id:1,name:"safeer"},  // Temporary array
             {id:2,name:"jon"},
             {id:3,name:"James"},
             {id:4,name:"deepak"},
             {id:5,name:"ajmal"}];

  var id = _.pluck(temp1,'id'); // Get id array from temp1
  var ids=[2,5,10];             // ids to be removed
  var bool_ids=[];
  _.each(ids,function(val){
     bool_ids[val]=true;
  });
  _.filter(temp1,function(val){
     return !bool_ids[val.id];
  });

언급URL : https://stackoverflow.com/questions/21659888/find-and-remove-objects-in-an-array-based-on-a-key-value-in-javascript

반응형