迭代列表创建新的唯一列表

时间:2018-02-19 20:56:56

标签: javascript ecmascript-6 vue.js vuejs2

我知道有些人会认为这是重复的,但在我的情况下(以及我的知识有限),我仍然没有找到任何与我有关的类似例子。 因此,我先说道歉:)

对于经验丰富的JS开发人员来说,我非常直接地假设..

我无法弄清楚如何匹配数组属性:

 if (!uniqueEnts.includes(ent.entity)) {  // how do i match on uniqueEnts.entityName ?

当前方法导致新列表中的命中次数过多,并且检查(上图)并未提供针对uniqueEnts.entityName的正确检查

JSON输入: enter image description here

期望的输出: 新列表(uniqueEntities)具有以下两个属性

  • entityName(唯一)
  • entityColor(随机生成)

代码:

 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
    },

错误: enter image description here

2 个答案:

答案 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() }));