2017-04-25 12 views
3

を優先して、オブジェクト:uniqの2つの配列オブジェクトと真の値に

var first = [{ 
    a: "one", 
    x: false 
}, { 
    a: "two", 
    x: true 
}, { 
    a: "three", 
    x: false 
}, { 
    a: "one", 
    x: true 
}, { 
    a: "two", 
    x: true 
}, { 
    a: "four", 
    x: false 
}]; 

期待される結果:

// Result 
[{ 
    a: "one", 
    x: true 
}, { 
    a: "two", 
    x: true 
}, { 
    a: "three", 
    x: false 
}, { 
    a: "four", 
    x: false 
}]; 

を見てわかるように、私はキーaの同じ値を持つ重複を省略しようとしていますが、そのオブジェクトを省略する前に、私は他の重複の中で比較し、キーの真の値を持つオブジェクトをプッシュしたいx真の値avai私はx: falseの値をにするだけです)。

これを実現するためにlodashまたはunderscoreを使用しています。

_.unionBy_.uniqByを使ってみましたが、x: trueを正しく理解する方法はわかりません。

答えて

1

ロダッシュの使用。

属性別グループa。次に、各グループ内のオブジェクトをマージします。真実の価値だけを保つ。

let array = [ 
 
    {a: 'one', x: false}, 
 
    {a: 'two', x: true}, 
 
    {a: 'three', x: false}, 
 
    {a: 'one', x: true}, 
 
    {a: 'two', x: true}, 
 
    {a: 'four', x: false}, 
 
]; 
 

 
let result = _(array) 
 
    .groupBy('a') 
 
    .map(objects => _.mergeWith(...objects, (a, b) => a || b)) 
 
    .value(); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

0
var results = []; 

first.forEach(f => { 
    var index = results.map(r => r.a).indexOf(f.a); 

    if(index === -1) { 
     results.push(f) 
    } else { 
     f.x && (results[index].x = true); 
    } 
}) 
0
var unique = _.uniqWith(first, _.isEqual); 
var result = unique.filter((item) => { 
    if (item.x) return true; 
    var sameA = unique.filter((i) => i.a === item.a); 
    return sameA.length === 1; 
}); 
関連する問題