【问题标题】:Check if all elements in an array are present in another检查数组中的所有元素是否存在于另一个数组中
【发布时间】:2016-07-27 15:56:35
【问题描述】:

我想创建一个函数来检查一个数组中的所有元素是否存在于另一个数组中。我试过这样做:

function includesAll (needles, haystack) {
  return needles.every((needle) => {
    return haystack.includes(needle)
  })
}

但是,当我为 needles 的空数组测试此函数时,像这样:includesAll([], [1]),它返回 true,而我期待 false(因为 [1].includes([]) 返回 false )。为什么会这样?你能写一个正确的函数吗(一个反映include行为的函数,但是是一个数组而不是一个元素)?

【问题讨论】:

  • 因为 [1].includes([]) 返回 false:但这不一样,也没有发生。 includes 没有传递给数组,而是该数组中的元素,因为没有元素,所以永远不会调用 includes。该函数应返回 true,因为没有不包含的元素。

标签: javascript arrays


【解决方案1】:

您的代码按预期工作。该函数应该返回 true,因为空的 needles 数组中没有元素包含在 haystack 中。

你写道:

因为 [1].includes([]) 返回 false

...但这不一样,也没有发生。 includes 方法不是传递给 needles 数组,而是传递该数组中的元素。由于没有, includes 永远不会被调用。该函数应返回true,因为没有不包含的元素。

如果出于某种原因您想要其他行为,您可以执行以下操作:

function includesAll (needles, haystack) {
    return !needles.length && needles.every(needle => haystack.includes(needle));
}

这样你要求函数只能返回true如果needles至少有一个元素。

【讨论】:

    【解决方案2】:

    你的逻辑有缺陷。在您的 includesAll 函数中,您正在比较两个数组。因此,

    includesAll([], [1]);
    

    应该返回true

    这不等于检查

    [1].includes([]);
    

    它正在检查数组[1] 是否包含一个空数组,它不包含。

    就你的功能而言,这就像检查

    includesAll([[]], [1]);
    

    应该返回false

    【讨论】:

      【解决方案3】:

      阅读this at MDN

      every 就像数学中的“所有人”量词。特别是,对于一个空数组,它返回 true。 (空集的所有元素都满足任何给定条件,这是空洞的事实。)

      【讨论】:

        猜你喜欢
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多