我知道有些人会认为这是重复的,但在我的情况下(以及我的知识有限),我仍然没有找到任何与我有关的类似例子。 因此,我先说道歉:)
对于经验丰富的JS开发人员来说,我非常直接地假设..
我无法弄清楚如何匹配数组属性:
if (!uniqueEnts.includes(ent.entity)) { // how do i match on uniqueEnts.entityName ?
当前方法导致新列表中的命中次数过多,并且检查(上图)并未提供针对uniqueEnts.entityName的正确检查
期望的输出: 新列表(uniqueEntities)具有以下两个属性
代码:
uniqueEntities() {
let uniqueEnts = []
this.nluDataUnfiltered.forEach(function (i) {
i.entities.forEach(function (ent) {
if (!uniqueEnts.includes(ent.entity)) {
let obj = {
entityName: ent.entity,
entityColor: Util.getRandomColor()
}
uniqueEnts.push(obj)
obj = null
}
})
})
return _uniqueEnts.entityName.sort().value()
// earlier tryout --> return _(uniq(uniqueEnts.entityName)).sort().value()
},
最新尝试更新:
uniqueEntities() {
let uniqueEntityObj
var uniqueEntity = Array.from(new Set( data.map(el => this.nluDataUnfiltered.entities[0].entity) ));
uniqueEntityObj = uniqueEntity.map(el => {
entityName:el,
entityColor: Util.getRandomColor()
});
return uniqueEntityObj
},
答案 0 :(得分:2)
步骤可能是从您的阵列中获取所有唯一实体。我这样做是使用集合,因为集合只能存储唯一值。然后再次使用.map
将其转换为对象数组。
var setDataRaw = this.nluDataUnfiltered.map(
(el) => {
if (el.entities.length == 0)
return [];
return el.entities.map(
(_entity) => {
return _entity.entity;
}
)
});
var setData = [].concat.apply([], setDataRaw);
var uniqueEntity = Array.from(new Set(setData));
var uniqueEntityObj = uniqueEntity.map((el) => {
return {
entityName: el,
entityColor: Util.getRandomColor()
};
});
答案 1 :(得分:1)
遵循同样的@ void关于从Array
创建Set
个唯一实体的想法,在这里您使用相同的代码,但使用spread operator和{{3创建完整的Array
实体。
let uniqueEntityObj = Array.from(
new Set(
nluDataUnfiltered.reduce(
(a, o) => (
[...a, ...(o.entities.map(so => so.entity))]
),
[]
)
)
).map(p => ( {entityName: p, entityColor: Util.getRandomColor()} ));
这里有紧凑(不太可读)的版本:
let uniqueEntityObj = Array.from(new Set(nluDataUnfiltered.reduce((a, o) => ([...a, ...(o.entities.map(so => so.entity))]), []))).map(p => ({entityName: p, entityColor: Util.getRandomColor() }));