【问题标题】:Does subarray contain a certain value?子数组是否包含某个值?
【发布时间】:2021-04-07 13:05:10
【问题描述】:

我有一个这样的数组:

var = [
    {
        "a": "value",
        "b": "value2"
    },
    {
        "a": "value3",
        "b": "value4"
    }
    ...
]

我需要查找是否有任何子数组包含某个值。

我试过了

var.flat().includes("value")

但由于某种原因,它总是返回 false,.flat() 甚至没有展平数组。

我也试过

var.includes("value")

没有.flat(),但只有在顶层包含它时才会返回。

我可以的

var = [
    "a": [
        "value",
        "value3"
        ...
    ],
    "b": [
        "value2",
        "value4"
        ...
    ]
]

但我宁愿不这样做,因为那需要我重写一些我已经写过的代码。

【问题讨论】:

标签: javascript arrays multidimensional-array sub-array


【解决方案1】:

在您的代码中,varr 已经是扁平化的对象数组。因为您要检查对象值。使用varr.map(Object.values).flat()

varr = [
  {
    a: "value",
    b: "value2",
  },
  {
    a: "value3",
    b: "value4",
  },
];

console.log(varr.map(Object.values).flat().includes("value"));

【讨论】:

    【解决方案2】:

    您可以使用some 进行迭代(遇到第一个value 时会立即停止循环),结合Object.values(从对象中获取值数组)和.includes(检查数组是否有value),

    const data = [
      {
        a: "value",
        b: "value2",
      },
      {
        a: "value3",
        b: "value4",
      },
    ];
    
    const valid = data.some((d) => Object.values(d).includes("value"));
    
    console.log(valid);

    【讨论】:

    • 这比reduce好多了。
    【解决方案3】:

    首先使用flatMap 将所有嵌套值提取到一个平面数组中:

    const objs = [
        {
            "a": "value",
            "b": "value2"
        },
        {
            "a": "value3",
            "b": "value4"
        }
    ];
    const values = objs.flatMap(Object.values);
    console.log(values.includes("value"));

    【讨论】:

    • 谢谢!我可以澄清一下这是如何工作的吗?具体来说,.flatMap().flat() 有何不同
    • @RedGuy11 见this
    • @RedGuy11 Object.values 接受一个对象并将其值提取为一个数组。 flatMap 映射一个数组,然后在生成的映射数组上调用 .flat()。就像.map 后跟.flat
    • @CertainPerformance 好的,谢谢。但是.map() 不需要回调(这就是@SaymoinSam 分享的链接所说的)
    • @RedGuy11 Object.values 是回调。每次迭代都会调用它并返回一个值数组。然后.flat 将值数组的数组展平。
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2011-04-02
    • 2020-08-11
    • 1970-01-01
    • 2021-06-06
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多