uniq 两个数组对象,且真值优先

uniq two array objects and give priority to true value

我正在尝试在数组对象中进行数组操作,如下所示:

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 的真实值(如果没有可用的真实值,那么我将仅推送 x: false)。

我愿意使用 lodashunderscore 来实现这一目标。

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

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);
   }
})

使用 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>

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;
});