尝试解析一个具有一堆相同“ secondaryID”的数据集,以便我可以对它们进行分组和遍历。
我想用英语做的是 “选择字段值唯一的所有项目的唯一组”
'use strict';
const data = [{
Group: 'A',
Name: 'SD'
}, {
Group: 'B',
Name: 'FI'
}, {
Group: 'A',
Name: 'MM'
}, {
Group: 'B',
Name: 'CO'
}];
let unique = [...new Set(data.map(item => item.Group))];
console.log(unique);
哪个给出[“ A”],[“ B”]
但是我正在寻找的是
{
A: [ "SD","MM" ],
B: [ "FI","CO" ],
}
答案 0 :(得分:1)
您还可以将数组reduce
{Group
键入分组对象):
const data = [{
Group: 'A',
Name: 'SD'
}, {
Group: 'B',
Name: 'FI'
}, {
Group: 'A',
Name: 'MM'
}, {
Group: 'B',
Name: 'CO'
}];
const grouped = data.reduce((a, {Group, Name}) => {
if (!(Group in a)) a[Group] = [Name];
else a[Group].push(Name);
return a;
}, {});
console.log(grouped);
答案 1 :(得分:1)
为此,我将使用array.reduce
而不是array.map
,因为您实际上希望返回的是一个 new 值,而不是一个经过修饰的数组reduce方法如果要将字面量简化为单个输出值(在这种情况下为唯一组的对象),则该方法非常理想。也许尝试这样的事情:
let unique = data.reduce((acc, { Group, Name }) => {
if (!(acc.hasOwnProperty(Group))) {
acc[Group] = [Name];
} else {
acc[Group].push(Name);
};
return acc;
}, {});
我还在https://codepen.io/anon/pen/BGpgdz?editors=1011处为此添加了一支笔,以便您可以看到它的工作。
希望这会有所帮助!
答案 2 :(得分:0)
可以做类似的事情。
const map = {};
data.forEach( d => {
if( map[d.Group] ) {
map[d.Group].push(d.Name);
} else {
map[d.Group] = [d.Name];
}
})
console.log(map)
答案 3 :(得分:0)
我认为最简单的方法是使用Array.prototype.reduce
方法创建一个对象,该对象将唯一的Group
名称映射到包含Name
的数组。您可以提供一个空的对象文字作为初始的reduce
累加器:
const data = [{
Group: 'A',
Name: 'SD'
}, {
Group: 'B',
Name: 'FI'
}, {
Group: 'A',
Name: 'MM'
}, {
Group: 'B',
Name: 'CO'
}];
var namesByGroup = data.reduce((map, el) => {
map[el.Group] ? map[el.Group].push(el.Name) : map[el.Group] = [el.Name];
return map;
}, {});
console.log(namesByGroup);
答案 4 :(得分:0)
如果您对功能性方法感兴趣,这里是使用Ramda的解决方案:
const group =
R.pipe(
R.groupBy(R.prop('Group')),
R.map(R.map(R.prop('Name'))));
console.log(
group([
{Group: 'A', Name: 'SD'},
{Group: 'B', Name: 'FI'},
{Group: 'A', Name: 'MM'},
{Group: 'B', Name: 'CO'}])
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
答案 5 :(得分:0)
也可以使用forEach
完成
const data = [{
Group: 'A',
Name: 'SD'
}, {
Group: 'B',
Name: 'FI'
}, {
Group: 'A',
Name: 'MM'
}, {
Group: 'B',
Name: 'CO'
}];
const somefunction = (data) => {
let arr = {}
data.forEach( ({Group, Name}) => {
Group in arr ? arr[Group].push(Name) : arr[Group] = [Name]
})
return arr;
}
console.log(somefunction(data))