将两个数组对象去重并优先考虑真值。

3

我试图在如下所示的arrays对象内进行数组操作:

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 值推入)。

我可以使用 lodash underscore 来实现此目的。

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

3个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接