如何通过深度嵌套的对象数组进行映射?
How to map through a deeply nested array of objects?
const my_arr = [
{id: 1, arr: [{subId: 1, value: 1}],
{id: 2, arr: [{subId: 2, value: 2}],
{id: 3, arr: [{subId: 3, value: 1}],
]
如何映射此数组 my_arr
,然后将 arr
映射到 return 数组,如下所示:
[
{subId: 1, value: 1},
{subId: 3, value: 1},
]
基本上只过滤掉值为 1 的地方,然后 return 只过滤那个子对象
我试过
my_arr.map((x) => x.map((y) => y.value === 1 ? y : null))
尝试这种方法
const my_arr = [
{id: 1, arr: [{subId: 1, value: 1}]},
{id: 2, arr: [{subId: 2, value: 2}]},
{id: 3, arr: [{subId: 3, value: 1}]},
]
const result = my_arr.flatMap(item => item.arr).filter(item => item.value === 1)
console.log(result)
您当前的方法映射到外部数组 my_arr
,然后使用内部映射映射到内部数组。由于 .map()
always returns an array, you'll end up mapping your objects from your outer array to other arrays, which you don't want. You can instead use .flatMap()
which will combine/join the returned inner arrays into one array. However, rather than using .map()
as your inner method though, you should use .filter()
创建了一个 value
为 1
的对象数组,然后将其合并到由 .flatMap()
方法创建的结果外部数组中:
const my_arr = [ {id: 1, arr: [{subId: 1, value: 1}]}, {id: 2, arr: [{subId: 2, value: 2}]}, {id: 3, arr: [{subId: 3, value: 1}]}, ];
const res = my_arr.flatMap(({arr}) => arr.filter(({value}) => value === 1));
console.log(res);
由于您正在处理嵌套结构,因此您将不得不发挥一点创意。
- 首先你必须过滤数组。
- 在里面,你可以用
.some
检查你的条件是否匹配,return匹配
- 现在您有了过滤后的列表,但您仍然需要格式化输出。您可以对每个项目使用
.reduce
和 concat arr
如果您在 arr
中有多个项目,这将很有用。
const my_arr = [
{id: 1, arr: [{subId: 1, value: 1}] },
{id: 2, arr: [{subId: 2, value: 2}] },
{id: 3, arr: [{subId: 3, value: 1}] },
]
const output = my_arr
.filter(({ arr }) =>
arr.some(({value}) => value === 1)
).reduce((acc, { arr }) => acc.concat(arr), [])
console.log(output)
const my_arr = [
{id: 1, arr: [{subId: 1, value: 1}],
{id: 2, arr: [{subId: 2, value: 2}],
{id: 3, arr: [{subId: 3, value: 1}],
]
如何映射此数组 my_arr
,然后将 arr
映射到 return 数组,如下所示:
[
{subId: 1, value: 1},
{subId: 3, value: 1},
]
基本上只过滤掉值为 1 的地方,然后 return 只过滤那个子对象
我试过
my_arr.map((x) => x.map((y) => y.value === 1 ? y : null))
const my_arr = [
{id: 1, arr: [{subId: 1, value: 1}]},
{id: 2, arr: [{subId: 2, value: 2}]},
{id: 3, arr: [{subId: 3, value: 1}]},
]
const result = my_arr.flatMap(item => item.arr).filter(item => item.value === 1)
console.log(result)
您当前的方法映射到外部数组 my_arr
,然后使用内部映射映射到内部数组。由于 .map()
always returns an array, you'll end up mapping your objects from your outer array to other arrays, which you don't want. You can instead use .flatMap()
which will combine/join the returned inner arrays into one array. However, rather than using .map()
as your inner method though, you should use .filter()
创建了一个 value
为 1
的对象数组,然后将其合并到由 .flatMap()
方法创建的结果外部数组中:
const my_arr = [ {id: 1, arr: [{subId: 1, value: 1}]}, {id: 2, arr: [{subId: 2, value: 2}]}, {id: 3, arr: [{subId: 3, value: 1}]}, ];
const res = my_arr.flatMap(({arr}) => arr.filter(({value}) => value === 1));
console.log(res);
由于您正在处理嵌套结构,因此您将不得不发挥一点创意。
- 首先你必须过滤数组。
- 在里面,你可以用
.some
检查你的条件是否匹配,return匹配 - 现在您有了过滤后的列表,但您仍然需要格式化输出。您可以对每个项目使用
.reduce
和 concatarr
如果您在 arr
中有多个项目,这将很有用。
const my_arr = [
{id: 1, arr: [{subId: 1, value: 1}] },
{id: 2, arr: [{subId: 2, value: 2}] },
{id: 3, arr: [{subId: 3, value: 1}] },
]
const output = my_arr
.filter(({ arr }) =>
arr.some(({value}) => value === 1)
).reduce((acc, { arr }) => acc.concat(arr), [])
console.log(output)