2017-04-25 54 views
3

我试图做给优先级的阵列中的数组操作对象,如下图所示:uniq的两个数组对象,并真正价值

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标签,那么我会推价值只有)。

我愿意使用lodashunderscore来实现此目的。

我试过使用_.unionBy_.uniqBy但我无法理解如何正确考虑x: true

回答

1

使用lodash。按照属性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; 
}); 
相关问题