我有一个像这样的变量
const data = {
code: 1,
items: [
{ nickname: 1, name: [
{id : "A"},
{id : "B"}
]
},
{
nickname: 2, name: [
{id: "A"},
{id: "C"}
]
}
]
}
之后,我想显示多少个字符:A:2,B:1,C:1
答案 0 :(得分:5)
您可以按照以下步骤操作:
flatMap()
上使用data.items
flatMap()
内使用map()
将所有对象转换为它们的id
,然后从flatMap()
返回。这样,您将数组["A","B","A","C"]
reduce()
并获得包含所有字母计数的对象。
const data = { code: 1, items: [ { nickname: 1, name: [ {id : "A"}, {id : "B"} ] }, { nickname: 2, name: [ {id: "A"}, {id: "C"} ] } ] }
const res = data.items.flatMap(x =>
x.name.map(a => a.id)
).reduce((ac,a) => (ac[a] = ac[a] + 1 || 1,ac),{});
console.log(res)
答案 1 :(得分:5)
const data = {
code: 1,
items: [
{
nickname: 1,
name: [
{ id: "A" },
{ id: "B" }
]
},
{
nickname: 2,
name: [
{ id: "A" },
{ id: "C" }
]
}
]
};
const res = data.items.reduce((acc, next) => {
next.name.forEach(({ id }) => {
acc[id] = acc[id] + 1 || 1;
});
return acc;
}, {});
console.log(res);
您可以使用reduce
一次拍摄。
减少data.items
将使您可以将当前循环的name
属性项目的值添加到累加器(最初是一个空对象)。
结果将是一个对象,该对象拥有每个数组的name
属性中每个遇到的字母的所有出现。
相关行说明:
data.items.reduce((acc, next)
将在data.items
上调用reduce方法。 acc
是约化累加器(最初是一个空对象),next
是item
中当前循环的data.items
。next.name.forEach(({id})
在这一行中,我们循环当前循环项(name
)的data.items[n]
属性。 ({id})
是一种简短的语法,用于获取foreach中循环项的id
属性。等效于(item => item.id)。acc[id] = acc[id] + 1 || 1;
尝试将累加器的属性[id](例如{}的“ A”)增加1。如果不存在,则将其值设置为1。return acc;
返回累加器。答案 2 :(得分:3)
您可以在循环分配名称和循环获取ID的过程中使用ID。
const
data = { code: 1, items: [{ nickname: 1, name: [{ id : "A" }, { id : "B" }] }, { nickname: 2, name: [{ id: "A" }, { id: "C" }] }] },
result = data.items.reduce(
(r, { name }) => (name.forEach(({ id }) => r[id] = (r[id] || 0 ) + 1), r),
{}
);
console.log(result);