【问题标题】:How do I compare the same value in multiple arrays?如何比较多个数组中的相同值?
【发布时间】:2020-12-30 08:29:53
【问题描述】:

我正在处理一个涉及嵌套数组的项目,我需要按大小对每个数组中的 1 个值进行排序。 (所有数组都采用相同的格式,例如 [a,b,c,d])。 为了更清楚,我如何从time[60][x] 这样的数组中选择更大的数字,其中 x 是数组的数量(这是一个非常奇怪的嵌套)。

const time = {
  15: [
    { language: 'english', raw: 105.6, acc: 93.94, wpm: 96, punctuation: false }
  ],
  30: [
    { language: 'english', raw: 66.4, wpm: 66.4, punctuation: false, difficulty: 'normal' }
  ],
  60: [
    { acc: 98.97, language: 'english', puncutation: false, wpm: 96, difficulty: 'normal' },
    { acc: 92.63, puncutation: false, language: 'english_10k', wpm: 59.19, raw: 60.99 }
  ]
};

如您所见,每个数组都嵌套了不同数量的数组,例如time[60][2] 中有 2 个数组。 这是对象的结构。我需要从每个数组的 wpm 列中找到最大值。 非常感谢任何和所有帮助, 谢谢

【问题讨论】:

  • “我需要从每个数组的 wpm 列中找出最大值”。您是指关键“时间”下每个数组的最大 wpm 吗?如果是这样,您的预期输出是什么?还是您的意思是以数字形式返回的整个集合中最大的 wpm?
  • 每个时间段集合的最大 wpm,例如15 秒测试 wpm 与 60 秒 wpm 不同。预期输出将是所选时间段(15、30 和 60 秒中)的最高 wpm,以小数表示

标签: javascript arrays sorting object nested


【解决方案1】:
Object
  .fromEntries(Object
    .entries(time)
    .map(([key, array]) => ([key, Math.max(...array.map(({ wpm }) => wpm))])));

现场示例:

const time = {
  15: [
    { language: 'english', raw: 105.6, acc: 93.94, wpm: 96, puncutation: false }
  ],
  30: [
    { language: 'english', raw: 66.4, wpm: 66.4, punctuation: false, difficulty: 'normal' }
  ],
  60: [
    { acc: 98.97, language: 'english', puncutation: false, wpm: 96, difficulty: 'normal' },
    { acc: 92.63, puncutation: false, language: 'english_10k', wpm: 59.19, raw: 60.99 }
  ]
};

const maxes = Object
  .fromEntries(Object
    .entries(time)
    .map(([key, array]) => ([key, Math.max(...array.map(({ wpm }) => wpm))])));

console.log(maxes);

保留整个对象,以便您可以访问除wpm之外的其他属性:

Object.fromEntries(Object.entries(time).map(([key, arr]) => ([key, arr.find(({ wpm }) => wpm == Math.max(...arr.map(({ wpm }) => wpm)))])));

【讨论】:

  • 非常感谢,这非常适合我的需要
  • 我建议不要在生产中使用这样的代码。一行代码非常整洁可爱,但很难调试代码中实际发生的情况。最重要的是,这段代码比我在下面给出的答案慢了大约 40%。 jsbench.me/gykeypgb4b/1
  • @GirkovArpa 如果我想从最高 wpm 所在的同一个数组中选择原始数据,我会简单地将“wpm”更改为“原始数据”吗?还是不会从同一个数组中提取,而只会从每个数组中找到 raw 的最高值?
  • 顺便说一下,将wpm 更改为raw,您的预感是正确的。
【解决方案2】:

如果我正确理解您的问题,这可能就是您需要的:

const time = {
  15: [{wpm: 10}, {wpm: 15}, {wpm: 20}],
  30: [{wpm: 5}, {wpm: 10}, {wpm: 30},],
  60: [{wpm: 4}, {wpm: 12}, {wpm: 8},]
};

const results = {};

// iterate over the time object
for (let key in time) {
  results[key] = time[key].reduce((acc, item) => {
    if (item.wpm > acc) {
      return item.wpm;
    }
    
    return acc;
  }, 0);
}

console.log(results);

这是一个代码笔:https://codepen.io/geuis/pen/VwaxWWY

【讨论】:

  • 您为什么坚持链接到外部代码笔而不是堆栈 sn-p?我将您的帖子编辑为 sn-p,然后您将其还原。
  • 感谢您的快速回答,我很难理解这段代码,它是否返回最高 wpm 的单个值?
  • @GirkovArpa 是的,不知道 sn-ps。整洁的功能。
  • 你有 35.7k 的声望,但你不知道 sn-ps?不过很高兴能提供帮助!
  • 好的,最初您的问题并不清楚。但我已经更新了答案,只返回最大的 wpm 值。
猜你喜欢
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多