【问题标题】:does include works with array of objects?是否包括与对象数组一起使用?
【发布时间】:2018-12-12 17:45:50
【问题描述】:

我正在尝试使用包含来查看对象是否在数组中,如下所示:

arr=[{name:'Dan',id:2}]

我想这样检查:

arr.includes({name:'Dan',id:2})

这返回false,有没有办法做到这一点?

【问题讨论】:

  • 这听起来可能令人惊讶,但在 javascript 中,这两个对象并不相等。所以你必须有一个函数接受两个对象并在认为它们相同时判断为真。

标签: javascript arrays object


【解决方案1】:

是否包含对象数组?

是的——如果您使用 same 对象作为数组中 includes 的参数:

const obj = {name: "Dan", id: 2};
const arr = [{name: "T.J.", id: 42}, obj, {name: "Joe", id: 3}];
console.log(arr.includes(obj));                  // true
console.log(arr.includes({name: "Dan", id: 2})); // false

includes 使用 === 检查,并且 o1 === o2 仅在 o1o2 引用 same 对象时才为真。在您的示例中,您使用的是两个不同但等效的对象。

对于您的用例,您可能需要some,它允许您执行回调以确定数组中的条目是否匹配条件:

if (arr.some(e => e.id === 2)) {

例子:

const obj = {name: "Dan", id: 2};
const arr = [{name: "T.J.", id: 42}, obj, {name: "Joe", id: 3}];
console.log(arr.some(obj => obj.id === 2));      // true

有多种方法可以旋转它,具体取决于您希望检查的内容(在this question's answers 中详细讨论),但这仅意味着调整您传递的函数的内容some

【讨论】:

  • 哇,这更好。 :)我也有同样的问题。通过引用与价值对吗?
  • @PraveenKumarPurushothaman - includes 中的检查是 ===(我应该在上面说过,并且会 :-))。只有当o1o2 都包含对同一对象的引用时,o1 === o2 才为真。 (变量持有对象引用,它们是值。虽然还有其他解释......)
  • @PraveenKumarPurushothaman:“按参考”和“按价值”的含义不同:en.wikipedia.org/wiki/Evaluation_strategy。此处不适用。
  • @PraveenKumarPurushothaman - 不,它只是用于不同事物的“引用”一词(对 object 的引用与对 variable,这是“通过引用”所涉及的)。
  • @PraveenKumarPurushothaman:简而言之:“* by reference/value”描述了变量/参数之间的关系。它与所涉及的实际值无关。值可以是“引用类型”值(如对象)或“值类型”值(基元):en.wikipedia.org/wiki/Value_type_and_reference_type。因此,JavaScript 是一种“* 按值”语言,它将对象实现为引用类型的值。
【解决方案2】:

不是那样的。请改用some

arr.some(obj => obj.id === 2)

检查是否存在id 等于2 的对象。

如果您同时检查idname,则:

arr.some(obj => obj.id === 2 && obj.name === "Dan")

【讨论】:

    【解决方案3】:

    数组确实有 includes() 函数,但对于您的情况,您必须使用 some()

    arr.some(e => e.id === 2 && e.name === "Dan")
    arr.some(e => e.name === "Dan")
    

    【讨论】:

    • 可能“但它只是检查原始值”,这是不正确的。或者,这可能是因为已经有两个答案使用some,这表明当你发现你第三次发布它时,最好删除它。
    • 是的,它使用同值零相等
    • @DerekPollard 哇,那是什么?
    • @DerekPollard 谢谢老兄! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2021-12-21
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多