从多维对象数组中查找ID

时间:2018-06-08 10:12:26

标签: javascript arrays multidimensional-array ecmascript-6

我有一个多维对象数组:

var products = [  
{ id: 1, groups: [ { id: 1.1, selected: true }, { id: 1.2, selected: false }}, 
{ id: 2, groups: [ { id: 2.1, selected: false }, { id: 2.2, selected: true }} ];

如何使用ES6在单维数组中找到所选组的列表(选定标志设置为true的组)。

预期结果:

[1.1, 2.2]

6 个答案:

答案 0 :(得分:2)

您可以使用reduce方法并在另外一个forEach循环中获取所选的true组对象。

var products = [  
{ id: 1, groups: [ { id: 1.1, selected: true }, { id: 1.2, selected: false }]}, 
{ id: 2, groups: [ { id: 2.1, selected: false }, { id: 2.2, selected: true }]} ];

const result = products.reduce((r, {groups}) => {
  groups.forEach(e => e.selected && r.push(e.id));
  return r;
}, [])
	
console.log(result)

答案 1 :(得分:2)

所有其他答案的可能替代方案。

展平数组,然后提取所需信息。

const products = [
    { id: 1, groups: [{ id: 1.1, selected: true }, { id: 1.2, selected: false }] },
    { id: 2, groups: [{ id: 2.1, selected: false }, { id: 2.2, selected: true }] }];

const allIds = [].concat(...products.map(p => p.groups)).filter(g => g.selected).map(x => x.id)

console.log(allIds)

答案 2 :(得分:1)

您可以使用如下所示的reduce和filter,这将为您提供selected: true的所有ID。请注意,我将id:1.2更改为true以证明获得多个真实结果的能力。



const products = [
  { id: 1, groups: [ { id: 1.1, selected: true }, { id: 1.2, selected: true } ]},
  { id: 2, groups: [ { id: 2.1, selected: false }, { id: 2.2, selected: true } ]} ];

const res = products.reduce((a, {groups}) => 
  a.concat(...groups.filter(({selected}) => selected).map(({id}) => id))
, []);

console.log(res);




答案 3 :(得分:1)

var products = [  
{ id: 1, groups: [ { id: 1.1, selected: true }, { id: 1.2, selected: false }]}, 
{ id: 2, groups: [ { id: 2.1, selected: false }, { id: 2.2, selected: true } ]}];

var desiredResult = products.map(product => {
  return product.groups.filter(group => group.selected).map(item => item.id).toString();
});
console.log(desiredResult);

答案 4 :(得分:0)

您可以使用mapfilterconcat功能获取结果

var products = [  
{ id: 1, groups: [ { id: 1.1, selected: true }, { id: 1.3, selected: true },{ id: 1.2, selected: false }]}, 
{ id: 2, groups: [ { id: 2.1, selected: false }, { id: 2.2, selected: true }]} ];

const selectgroups =  [].concat(...products.map(x => x.groups.filter(g=> g.selected)));
const selectedGroupIds = selectgroups.map(g=> g.id);

console.log(selectedGroupIds);

代码,提供所有选定组的列表

Working Demo

答案 5 :(得分:0)

我看到了一种完全不同的方法:使用专门的数据结构按照您希望的方式对数据进行建模:

// Store product id mapped to a set of
// group ids
const productGroupMap = new Map ( [
   [ 1, new Set ( [ 1.1, 1.2 ] ) ],
   [ 2, new Set ( [ 2.1, 2.2 ] ) ]
] )

// Store group ids to their data
const groupMap = new Map ( [
   [ 1.1, { title: "Title 1.1" } ],
   [ 1.2, { title: "Title 1.2" } ],
   [ 2.1, { title: "Title 2.1" } ],
   [ 2.2, { title: "Title 2.2" } ]
] )

// Somewhere in your application, you would declare
// a set of selected group ids, and you would add ids
// when the user selects a given group
const selectedGroups = new Set ()

selectedGroups.add ( 1.1 )
selectedGroups.add ( 2.2 )

// Finally, when you want these selected groups, you just need to
// map selected group ids to their group data getting it from the
// groupMap
const groups = [ ...selectedGroups ].map ( id => groupMap.get ( id ) )

console.log ( groups )