如何通过不同的条件访问、合并和收集嵌套数据结构中的数组值?
How to access, merge and collect array values within a nested data structure by different criteria?
我有以下对象数组。如您所见,我有 2 个名为 VEGGIES
和 FRUITS
的 runType。每个 runType
都会有一个垂直列表。例如VEGGIES
有 SPINACH, TOMATO, ONION
,FRUITS 有 APPLE, BANANA, GRAPES
let data = [
{
"runType": "VEGGIES",
"verticals": [
{
"vertical": "SPINACH",
"radars": {}
},
{
"vertical": "TOMATO",
"radars": {}
},
{
"vertical": "ONION",
"radars": {}
},
],
"total_count": {}
},
{
"runType": "FRUITS",
"verticals": [
{
"vertical": "APPLE",
"radars": {
}
},
{
"vertical": "BANANA",
"radars": {}
},
{
"vertical": "GRAPES",
"radars": {
"P5": 8
}
}
],
"total_count": {
"P5": 8
}
}
]
就我而言,我想提取这些 vertical
值并将它们放入一个数组中。对于常规对象数组,我们可以使用此代码来完成上述任务。
let result = data.map(({ verticals }) => vertical)
但是我的代码在对象数组中有对象数组。有人可以让我知道如何实现这 3 个场景吗
- 场景 1 - 获取两种 runType 的所有垂直行业。结果应该是
[菠菜、番茄、洋葱、苹果、香蕉、葡萄]
- 场景 2- 获取 runType = 'VEGGIES' 的所有垂直行业。结果应该是
[菠菜、番茄、洋葱]
- 场景 3 - 获取 runType = 'FRUITS' 的所有垂直行业。结果应该是
[苹果、香蕉、葡萄]
有人可以阐明这个特定数据吗?
试试这个:
let data = [{
"runType": "VEGGIES",
"verticals": [{
"vertical": "SPINACH",
"radars": {}
},
{
"vertical": "TOMATO",
"radars": {}
},
{
"vertical": "ONION",
"radars": {}
},
],
"total_count": {}
},
{
"runType": "FRUITS",
"verticals": [{
"vertical": "APPLE",
"radars": {
}
},
{
"vertical": "BANANA",
"radars": {}
},
{
"vertical": "GRAPES",
"radars": {
"P5": 8
}
}
],
"total_count": {
"P5": 8
}
}
]
var findData = (runType) => data.filter(x => x.runType == runType).map(x => x.verticals)[0].map(i => i.vertical)
console.log("VEGGIES:", findData("VEGGIES"))
console.log("FRUITS:", findData("FRUITS"))
console.log("COMBINED:", findData("VEGGIES").concat(findData("FRUITS")))
另外map
the OP also might have a look into flatMap
and find
... reduce
也值得一试...
let data = [{
"runType": "VEGGIES",
"verticals": [{
"vertical": "SPINACH",
"radars": {},
}, {
"vertical": "TOMATO",
"radars": {},
}, {
"vertical": "ONION",
"radars": {},
}],
"total_count": {},
}, {
"runType": "FRUITS",
"verticals": [{
"vertical": "APPLE",
"radars": {},
}, {
"vertical": "BANANA",
"radars": {},
}, {
"vertical": "GRAPES",
"radars": {
"P5": 8,
},
}],
"total_count": {
"P5": 8,
},
}];
// Scenario 1
// - Get all the verticals for both runType.
// - Result should be [SPINACH, TOMATO, ONION, APPLE, BANANA, GRAPES]
console.log('Scenario 1 ... ', data
.flatMap(({ verticals }) =>
verticals.map(({ vertical }) => vertical)
)
);
// Scenario 2
// - get all verticals for runType = 'VEGGIES'.
// - Result should be [SPINACH, TOMATO, ONION]
console.log('Scenario 2 ... ', data
.find(item => item.runType === 'VEGGIES')
.verticals.map(({ vertical }) => vertical)
);
// Scenario 3
// - get all verticals for runType = 'FRUITS'.
// - Result should be [APPLE, BANANA, GRAPES]
console.log('Scenario 3 ... ', data
.find(item => item.runType === 'FRUITS')
.verticals.map(({ vertical }) => vertical)
);
// Bonus
// - based on Array#reduce one can achieve everything at once
function groupMergeAndCollectVerticals(collector, item) {
const { index, list } = collector;
const { runType, verticals } = item;
const group = (index[runType] ??= []);
const verticalList = verticals.map(({ vertical }) => vertical);
group.push(...verticalList);
list.push(...verticalList);
return collector;
}
const verticalsCollection =
data.reduce(groupMergeAndCollectVerticals, { index: {}, list: [] });
console.log(
'reduce based :: all at once ... ',
verticalsCollection
);
console.log(
'reduce based :: Scenario 1 ... ',
verticalsCollection.list
);
console.log(
'reduce based :: Scenario 2 ... ',
verticalsCollection.index['VEGGIES']
);
console.log(
'reduce based :: Scenario 3 ... ',
verticalsCollection.index['FRUITS']
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
我有以下对象数组。如您所见,我有 2 个名为 VEGGIES
和 FRUITS
的 runType。每个 runType
都会有一个垂直列表。例如VEGGIES
有 SPINACH, TOMATO, ONION
,FRUITS 有 APPLE, BANANA, GRAPES
let data = [
{
"runType": "VEGGIES",
"verticals": [
{
"vertical": "SPINACH",
"radars": {}
},
{
"vertical": "TOMATO",
"radars": {}
},
{
"vertical": "ONION",
"radars": {}
},
],
"total_count": {}
},
{
"runType": "FRUITS",
"verticals": [
{
"vertical": "APPLE",
"radars": {
}
},
{
"vertical": "BANANA",
"radars": {}
},
{
"vertical": "GRAPES",
"radars": {
"P5": 8
}
}
],
"total_count": {
"P5": 8
}
}
]
就我而言,我想提取这些 vertical
值并将它们放入一个数组中。对于常规对象数组,我们可以使用此代码来完成上述任务。
let result = data.map(({ verticals }) => vertical)
但是我的代码在对象数组中有对象数组。有人可以让我知道如何实现这 3 个场景吗
- 场景 1 - 获取两种 runType 的所有垂直行业。结果应该是 [菠菜、番茄、洋葱、苹果、香蕉、葡萄]
- 场景 2- 获取 runType = 'VEGGIES' 的所有垂直行业。结果应该是 [菠菜、番茄、洋葱]
- 场景 3 - 获取 runType = 'FRUITS' 的所有垂直行业。结果应该是 [苹果、香蕉、葡萄]
有人可以阐明这个特定数据吗?
试试这个:
let data = [{
"runType": "VEGGIES",
"verticals": [{
"vertical": "SPINACH",
"radars": {}
},
{
"vertical": "TOMATO",
"radars": {}
},
{
"vertical": "ONION",
"radars": {}
},
],
"total_count": {}
},
{
"runType": "FRUITS",
"verticals": [{
"vertical": "APPLE",
"radars": {
}
},
{
"vertical": "BANANA",
"radars": {}
},
{
"vertical": "GRAPES",
"radars": {
"P5": 8
}
}
],
"total_count": {
"P5": 8
}
}
]
var findData = (runType) => data.filter(x => x.runType == runType).map(x => x.verticals)[0].map(i => i.vertical)
console.log("VEGGIES:", findData("VEGGIES"))
console.log("FRUITS:", findData("FRUITS"))
console.log("COMBINED:", findData("VEGGIES").concat(findData("FRUITS")))
另外map
the OP also might have a look into flatMap
and find
... reduce
也值得一试...
let data = [{
"runType": "VEGGIES",
"verticals": [{
"vertical": "SPINACH",
"radars": {},
}, {
"vertical": "TOMATO",
"radars": {},
}, {
"vertical": "ONION",
"radars": {},
}],
"total_count": {},
}, {
"runType": "FRUITS",
"verticals": [{
"vertical": "APPLE",
"radars": {},
}, {
"vertical": "BANANA",
"radars": {},
}, {
"vertical": "GRAPES",
"radars": {
"P5": 8,
},
}],
"total_count": {
"P5": 8,
},
}];
// Scenario 1
// - Get all the verticals for both runType.
// - Result should be [SPINACH, TOMATO, ONION, APPLE, BANANA, GRAPES]
console.log('Scenario 1 ... ', data
.flatMap(({ verticals }) =>
verticals.map(({ vertical }) => vertical)
)
);
// Scenario 2
// - get all verticals for runType = 'VEGGIES'.
// - Result should be [SPINACH, TOMATO, ONION]
console.log('Scenario 2 ... ', data
.find(item => item.runType === 'VEGGIES')
.verticals.map(({ vertical }) => vertical)
);
// Scenario 3
// - get all verticals for runType = 'FRUITS'.
// - Result should be [APPLE, BANANA, GRAPES]
console.log('Scenario 3 ... ', data
.find(item => item.runType === 'FRUITS')
.verticals.map(({ vertical }) => vertical)
);
// Bonus
// - based on Array#reduce one can achieve everything at once
function groupMergeAndCollectVerticals(collector, item) {
const { index, list } = collector;
const { runType, verticals } = item;
const group = (index[runType] ??= []);
const verticalList = verticals.map(({ vertical }) => vertical);
group.push(...verticalList);
list.push(...verticalList);
return collector;
}
const verticalsCollection =
data.reduce(groupMergeAndCollectVerticals, { index: {}, list: [] });
console.log(
'reduce based :: all at once ... ',
verticalsCollection
);
console.log(
'reduce based :: Scenario 1 ... ',
verticalsCollection.list
);
console.log(
'reduce based :: Scenario 2 ... ',
verticalsCollection.index['VEGGIES']
);
console.log(
'reduce based :: Scenario 3 ... ',
verticalsCollection.index['FRUITS']
);
.as-console-wrapper { min-height: 100%!important; top: 0; }