2017-05-09 9 views
0

중복을 포함 할 수있는 개체 배열이 있지만 속성별로 배열의 고유화를 원하는 다음 조건부로 조건부로 병합 속성을 병합하려고합니다. 예를 들어, 이름, propertyA는, propertyB 및 propertyC, 나는 이름 속성으로 uniquify 및 propertyA, propertyB 및 propertyC의 진정한 값을 유지하고자 한 각 객체를 알고고유 한 배열의 개체 및 lodash 또는 밑줄을 사용하여 중복을 병합

var array = [ 
    { 
    name: 'object1', 
    propertyA: true, 
    propertyB: false, 
    propertyC: false 
    }, 
    { 
    name: 'object2', 
    propertyA: false, 
    propertyB: true, 
    propertyC: false 
    }, 
    { 
    name: 'object1', 
    propertyA: false, 
    propertyB: true, 
    propertyC: false 
    } 
] 

아래의 배열을 제공 . 그래서 위의 배열은

var updatedArray = [ 
    { 
    name: 'object1', 
    propertyA: true, 
    propertyB: true, 
    propertyC: false 
    }, 
    { 
    name: 'object2', 
    propertyA: false, 
    propertyB: true, 
    propertyC: false 
    } 
] 

이 사용 lodash에 대해 갈 수있는 가장 좋은 방법은 무엇입니까

/밑줄이됩니까?

답변

1

당신은 _.uniqWith를 사용 할 수 있지만, 그것은 그들이 동일 여부의 부울 값을 반환하기 전에 매개 변수 중 하나를 돌연변이해야하는 것, 그래서 그것을하지 않는 것이 좋습니다.

보다 나은 옵션은 _.groupBy 다음에 _.map을 사용하여 고유 한 이름을 그룹화 한 다음이를 결합하는 방법을 사용자 정의하는 것입니다. 귀하의 경우에는 _.assignWith을 사용하여 동일한 이름의 오브젝트를 결합한 다음 결합 기능으로 논리 또는 || 조작을 제공 할 수 있습니다. ES6 함께

, 그것은 거의 한 라이너된다 : 그런데

var array = [{"name":"object1","propertyA":true,"propertyB":false,"propertyC":false},{"name":"object2","propertyA":false,"propertyB":true,"propertyC":false},{"name":"object1","propertyA":false,"propertyB":true,"propertyC":false}]; 
 
    
 
var updatedArray = 
 
    _(array) 
 
    .groupBy('name') 
 
    .map(objs => _.assignWith({}, ...objs, (val1, val2) => val1 || val2)) 
 
    .value(); 
 
    
 
console.log(updatedArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

([''_.map' _.groupBy' 및 모든 나중에 문제를 해결] http://stackoverflow.com/a/38774930/5743988) (이 같은 문제에 대한 일반적인 패턴입니다). – 4castle

+0

완벽하게 작동합니다! 감사! – frostme

0

일반 자바 스크립트를 사용하면 해시 테이블을 동일한 이름의 고유 한 개체에 대한 참조로 사용하고 루프를 통해 키 값을 수집하고 논리 OR로 업데이트 할 수 있습니다.

var array = [{ name: 'object1', propertyA: true, propertyB: false, propertyC: false }, { name: 'object2', propertyA: false, propertyB: true, propertyC: false }, { name: 'object1', propertyA: false, propertyB: true, propertyC: false }], 
 
    unique = array.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!hash[a.name]) { 
 
       hash[a.name] = { name: a.name }; 
 
       r.push(hash[a.name]); 
 
      } 
 
      Object.keys(a).forEach(function (k) { 
 
       if (k !== 'name') { 
 
        hash[a.name][k] = hash[a.name][k] || a[k]; 
 
       } 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }