2016-06-07 2 views
0

ID가 중복되지만 속성이 다른 동일한 객체의 이전 버전을 제거하려고합니다. 자바 스크립트는 최신 버전을 유지하면서 중복 속성을 가진 배열 개체를 제거합니다.

내 배열 개체에 대한 수정의 역사를 포함하고 다음과 같은 : I 중복 ID를 가진 개체가없는 있도록이 배열을 필터링하고 싶습니다

[ 

    { 
    id:"1", 
    status:"foo", 
    day: "01/01/1111" 
    }, 
    { 
    id:"2", 
    status:"foo", 
    day: "01/01/1111" 
    }, 
    { 
    id:"1", 
    status:"bar", 
    day: "02/01/1111" 
    }, 

] 

. 그러나 최신 버전이 유지됩니다. 이 경우에는 id가 1입니다. status:'bar'의 버전이 유지됩니다.

어떻게해야합니까? 프로젝트의 다른 부분에서 underscore.js을 사용하고 있습니다. 그리고 저는 그것이 .uniq를 가지고 있음을 압니다. 하지만 최신 버전을 제공 할 수 있도록 사용 방법을 잘 모르겠습니다.

덧붙여서 나는 this question을 보았습니다. 이것은 제가 묻고있는 것과 매우 흡사합니다. 그러나 그것은 5 년 전의 일입니다. 그래서 현대적인 방법으로 htings를하고 있는지 궁금합니다.

답변

0

본인이 이후인가요?

function updateList(a_list) { 

    var seen = {}; 

    for (var entry in a_list) { 
     var id = a_list[entry]["id"]; 

     if (seen.hasOwnProperty(id)) { 
      var current_newest_date = new Date(seen[id]["day"]).getTime(); 
      var check_newest_date = new Date(a_list[entry]["day"]).getTime(); 

      if (current_newest_date < check_newest_date) { 
       seen[id] = a_list[entry]; 
      } 

     } else { 
      seen[id] = a_list[entry]; 
     } 
    } 

    var updated = []; 
    for (var newest in seen) { 
     updated.push(seen[newest]); 
    } 
    return updated; 
} 

여기에는 날짜가 월/일/년 형식 인 것으로 가정합니다.

0

이 작업을 시도해야합니다 :

정렬이 후

data.sort(function(a,b) { 
    if (new Date(a.day) > new Date(b.day)) 
     return -1; 
    if (new Date(a.day)< new Date(b.day)) 
     return 1; 
    return 0; 
}); 

내림차순 날짜별로 배열 당신은 중복 그것은 작동 및 간단한 너무

var temp = {}; 
for(var i = 0; i < data.length ; i++){ 
    var obj = data[i]; 
    if(temp[obj.id] >= 0){ 
     data.splice(i, 1); 
     i--; 
    } 
    temp[obj.id] = i; 
} 
console.log(data) 

개체를 제거 할 수 있습니다 .. :)

0

배열을 ID로 정렬하고 결과로 배열을 배열

function Filter(arrObjs){ 

    function sortId(a, b){ 
    return a.id - b.id; 
    } 

    var y = arrObjs.sort(sortId); 

    var result = []; 

    var max = y[0].day; 
    for(var i = 1; i < y.length; i++){ 

    if(y[i -1].id == y[i].id){ 
     if(y[i].day > max){ 
      max = y[i].day; 
     } 
    } 
    else{ 
     result.push(y[i -1]); 
     max = y[i].day; 
     if(i + 1 === y.length) 
      result.push(y[i]); 
    } 
    } 

    return result; 
} 
0

필터 및 정렬없이 O (n) (단일 패스)와 함께 완전히 고성능 솔루션입니다. ids를 인덱스로 사용하기 때문에 어떤 경우에는 희소 배열이 될 수도 있습니다. 어떤 식별자가없는 상기와 같은 희소 배열의 경우

var data = [{id:"1",status:"foo",day: "01/01/1111"},{id:"2",status:"foo",day: "01/01/1111"},{id:"1",status:"bar",day: "02/01/1111"},], 
 
reduced = data.reduce((p,c) => {var d1 = !!p[c.id] && new Date(p[c.id].day), 
 
            d2 = new Date(c.day); 
 
           (!d1 || d1 < d2) && (p[c.id] = c); // if no d1 or d1 < d2 insert at index position designated by the id 
 
           return p;},[]); 
 
console.log(reduced); 
 
var s = new Set(reduced); // now only one undefined left 
 
s.delete(undefined); // get rid of that one too and use as a set or 
 
reduced = [...s]; //get back your now properly reduced array. 
 
console.log(reduced);
, 당신은 그 인덱스에서 정의되지 않은 값을 가질 것이다. 그럼 당신은 단순히 같은 짓을함으로써 그들을 제거 할 수 있습니다

var s = new Set(reduced); // now only one undefined left 
s.delete(undefined); // get rid of that one too and use as a set or 
reduced = [...s]; //get back your now properly reduced array.