我遇到一个复杂的情况,我需要在数组数组中有唯一的值。
这就是我现在所拥有的:
var ar = [{
"theFirstArray": [
[{
"no": 1
}, {
"no": 2
}, {
"no": 3
}, {
"no": 4
}, {
"no": 11
}]
],
"theSecondArray": [{
"no": 3
},
{
"no": 1
},
{
"no": 4
},
{
"no": 9
},
{
"no": 39
},
{
"no": 18
},
{
"no": 19
}
],
"theThirdArray": [{
"no": 20
}, {
"no": 12
}, {
"no": 10
}, {
"no": 9
}, {
"no": 16
}]
}]
我需要实现的目标:
[{
"theFirstArray":[{"no":1},{"no":2},{"no":3},{"no":4}]
},{
"theSecondArray":[{"no":9}, {"no":39}, {"no":18}, {"no":19}]
},{
"theThirdArray":[{"no":20},{"no":12},{"no":10},{"no":16}]
}]
PS。请注意,我只需要在每个子数组中输出4个值,并且所有数组中的值都不会重复。
我已经尝试了以下内容:
_.uniqBy(ar, 'no');
确实,我只得到结果中的唯一值;但是,我无法获得与以下相同的通缉结构:
[{
theFirstArray:[{"no":1,"no":2,"no":3,"no":4, "no":9, "no":39, "no":18, "no":19, "no":20,"no":12,"no":10,"no":16}]
}]
我也曾尝试使用_.map,但这并没有奏效!
答案 0 :(得分:0)
您可以使用以下内容:
userApp.delete()
从我假设的例子中,你在对象中只有一个键。
如果在每个数组(包含{no:1}之类的对象的数组)中总是有唯一值,那么你可以脱离线:
function getUniqueArrays(arr) {
var uniqAr = [];
var allArr = [{
no: null
}];
arr.forEach(function(item) {
var itemKey = Object.keys(item)[0];
var itemArr = _.uniqBy(item[itemKey], 'no');
var itemArr = _.differenceBy(itemArr, allArr, 'no').slice(0, 4);
allArr = itemArr.concat(allArr);
var newItem = {};
newItem[itemKey] = itemArr;
uniqAr.push(newItem);
})
return uniqAr;
}
答案 1 :(得分:0)
Lodash所有的东西!您可以使用reduce
存储已经看到的值并使用uniqBy
清除它们,并且只为每个循环周期获取differenceBy
所需的值。
以下是它的外观:
_.map(items, item => _.reduce(
_.toPairs(item),
({ seenValues, result }, [key, values]) => ({
seenValues: _.uniqBy([...seenValues, ...values], 'no'),
result: {
...result,
[key]: _.take(_.differenceBy(values, seenValues, 'no'), 4)
}
}),
{ seenValues: [], result: {} }
));
我们使用toPairs
在reduce函数中包含解压缩的key
和value
,因此我们可以重新构建所需的结构。
最后,你可以获得result
财产。请查看此jsbin:http://jsbin.com/tikoyehapi/1/edit?js,console了解更多信息。