【问题标题】:Group the parent object array based on the filter of the child object array根据子对象数组的过滤器对父对象数组进行分组
【发布时间】:2021-11-28 16:02:36
【问题描述】:

我已经编码并且得到了我想要的结果,但我认为这段代码看起来不干净。

const verses = [{
    index: 1,
    verses: [{
        level: 1
      },
      {
        level: 1
      }
    ]
  },
  {
    index: 2,
    verses: [{
        level: 1
      },
      {
        level: 1
      }
    ]
  },
  {
    index: 3,
    verses: [{
      level: 2
    }]
  },
  {
    index: 4,
    verses: [{
      level: 2
    }]
  },
  {
    index: 5,
    verses: [{
        level: 2
      },
      {
        level: 2
      }
    ]
  },
  {
    index: 6,
    verses: [{
        level: 3
      },
      {
        level: 3
      }
    ]
  },
  {
    index: 7,
    verses: [{
        level: 3
      },
      {
        level: 3
      },
      {
        level: 4
      },
      {
        level: 4
      }
    ]
  }
]

function getVerseIndexByLevel(level) {
  const result = verses.map(v => {
    const mappingByLevel = Math.max.apply(Math, [...new Set(v.verses.map(w => w.level))])
    const mappingByVerse = v.index

    return {
      level: mappingByLevel,
      verse: mappingByVerse
    }
  }).filter(v => v.level === level).map(v => v.verse)

  return result
}

for (let i = 1; i <= 4; i++) {
  console.log({
    level: i,
    verse: getVerseIndexByLevel(i)
  })
}

我上面的代码是否消耗太多性能?

你能在不改变结果的情况下让它更简洁吗?

-我不知道我还要添加什么细节,StackOverflow 强迫我写这个,因为帖子主要是代码。但我希望你只看代码的结果就明白了。-

【问题讨论】:

    标签: javascript arrays mapping


    【解决方案1】:

    在性能方面,我可以看到可以改进的一件事是只调用一次getVerseIndexByLevel,并使用计算的结果映射,而不是多次调用它(每次都需要重新解析输入)。类似的东西

    const verseIndicies = getVerseIndicies();
    for (let i = 1; i <= 4; i++) {
      console.log({
        level: i,
        verse: verseIndicies[i]
      })
    }
    

    另一个小改进 - 因为您使用的是 ES6 语法,所以您不需要将 .applyMath.max - 只需将集合传播到其中即可。

    您也不需要先将级别编号转换为 Set - 因为无论如何它都会被传递到 Math.max,所以重复不是问题。

    const verses=[{index:1,verses:[{level:1},{level:1}]},{index:2,verses:[{level:1},{level:1}]},{index:3,verses:[{level:2}]},{index:4,verses:[{level:2}]},{index:5,verses:[{level:2},{level:2}]},{index:6,verses:[{level:3},{level:3}]},{index:7,verses:[{level:3},{level:3},{level:4},{level:4}]}];
    
    function getVerseIndicies() {
      const verseIndicies = {};
      for (const v of verses) {
          const level = Math.max(...v.verses.map(w => w.level));
          verseIndicies[level] ??= [];
          verseIndicies[level].push(v.index);
      }
      return verseIndicies;
    }
    
    const verseIndicies = getVerseIndicies();
    for (let i = 1; i <= 4; i++) {
      console.log({
        level: i,
        verse: verseIndicies[i]
      })
    }

    【讨论】:

    • 你能解释一下这个相等是什么意思??=吗?因为我在那条线上收到一个错误,上面写着Unexpected token '??='。但是我用if (verseIndicies[level] == null) verseIndicies[level] = [] 更改了行,然后它工作正常并得到了相同的结果。
    猜你喜欢
    • 2021-03-21
    • 2021-09-12
    • 1970-01-01
    • 2021-09-25
    • 2023-01-25
    • 2018-12-25
    • 1970-01-01
    • 2020-12-14
    • 2020-12-03
    相关资源
    最近更新 更多