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
值)。
我愿意使用 lodash
或 underscore
来实现这一目标。
我尝试使用 _.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;
});
我正在尝试在数组对象中进行数组操作,如下所示:
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
。
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;
});