【问题标题】:Check for same values in nested array检查嵌套数组中的相同值
【发布时间】:2021-03-31 04:43:36
【问题描述】:

我有一个嵌套数组。它们都有一个名为 name 的值。 name 可以是 A 或 B。现在我想比较所有元素,如果所有元素都是 A 或 B,我想得到 true。

输入:

[
  {
    "arr": {
      "teachers": [
        {
          "name": "A"
        }
      ]
    }
  },
  {
    "arr2": {
      "teachers": [
        {
          "name": "B"
        }
      ]
    }
  }
]

我想检查是否所有的 foo 值都相同。

我有一个解决方案,但它看起来很难看,因为我必须放“A”:

const foo = this.arr.map(i => i.teachers.every(j => j.name.includes('A')));
const foo2 = foo.every(e => e === foo[0]);

【问题讨论】:

  • 在平台 sn-p 中运行相同的代码会引发错误 i.teachers is undefined。 Map 没有展平您的数组,或者换句话说,没有映射嵌套数组。您需要使用递归解决方案或使用其他内置方法先展平数组,然后检查所有值是 A 还是 B

标签: javascript arrays typescript dictionary


【解决方案1】:

您可以映射到一个名称数组,从中创建一个 Set 并检查它的大小:

 const names = arr.flatMap(it => it.teachers.map(teacher => teacher.name));

 (new Set(names)).size === 1

或者,您可以将名字与所有其他名字进行比较:

  names.every(it => it === names[0])

【讨论】:

  • 大小不是2吗?
  • flatMap 是实验性的。使用会有风险
  • @matt 我读到“现在我想比较所有元素,如果所有元素都是 A 或 B,我想得到正确的结果。”作为互斥的“全 A”或“全 B”。
  • @sarah 没有。它由所有运行时指定和支持(IE 除外)。如果您需要更好的支持,请使用 polyfill。
  • @JonasWilms es2019 我们使用 es2018 我不能使用 flatMaps :(
【解决方案2】:

首先获得teacher 中的一个name。然后根据比较值检查所有名称。

const
    compareValue = Object.values(array[0])[0].teachers[0].name,
    hasSameName = array.every(o =>
        Object.values(o)[0].teachers.every(({ name }) => name === compareValue)
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多