我有一个映射的数组对象,现在我需要从该数组的子级获取唯一值。
const arr=[
{
name: 'name1',
functions:{
0:{
name:'some1',
property: 'string'
},
1:{
name:'some1',
property: 'string'
},
2:{
name:'some3',
property: 'number'
}
}
},
]
<div>
{
arr.map((item, index) => {
let ars=[]
//console.log(item.functions)
for(const key in item.functions){
if(ars.indexOf(item.functions[key])>1){
ars.push(item.functions[key])
}
}
console.log(ars)
return <div key={index}>
<h2>{item.name}</h2>
{
ars.map((i)=>(
<p>{i.name}</p>
))
}
</div>
})
}
</div>
我需要获取如下值: some1 some3
因此,我只需要从属性字符串中获得一个名称。对于数字,只有一个名字。
答案 0 :(得分:1)
您可以为property
创建一个Set
。如果尚未添加property
,请将属性的name
添加到数组中。
const arr = [{
name: 'name1',
functions: {
0: {
name: 'some1',
property: 'string'
},
1: {
name: 'some2',
property: 'string'
},
2: {
name: 'some3',
property: 'number'
}
}
}]
const propertySet = new Set,
names = []
for (const { functions } of arr) {
Object.values(functions).forEach(o => {
if (!propertySet.has(o.property)) {
names.push(o.name);
propertySet.add(o.property)
}
})
}
console.log(names)
答案 1 :(得分:0)
如果基于property
的字符串表示形式的唯一性就足够了,并且name
的值始终是真实的,则可以使用以下代码:
const arr = [{name: 'name1', functions: {0: {name: 'some1', property: 'string'}, 1: {name: 'some2', property: 'string'}, 2: {name: 'some3', property: 'number'}}}];
let lookup = {};
arr.forEach(obj => {
Object.values(obj.functions).forEach(func => {
lookup[func.property] || (lookup[func.property] = func.name);
});
});
console.log(Object.values(lookup));
注意:由于使用了字符串表示形式,因此该解决方案将property: 123
和property: "123"
视为相同的值。如果以下是选项name: ""
,name: null
等,则使用第一个真实的name
,如果不存在真实的名称,则使用最后一次出现的name
代替。