【问题标题】:Find object in array of nested objects在嵌套对象数组中查找对象
【发布时间】:2020-02-07 07:25:23
【问题描述】:
const inventory = [
  { name: { vegetable: 'carrot' }, quantity: 2 },
  { name: { meat: 'pork' }, quantity: 0 },
  { name: { fruit: 'cherries' }, quantity: 5 },
];

const result = inventory.find(name => name === { fruit: 'cherries' });
console.log(result);

我有一组嵌套对象,我试图找出是否有一个包含{ fruit: 'cherries' } 对象,但结果是未定义。

所以我猜你不能将对象作为搜索参数传递?

【问题讨论】:

  • 你不能像那样比较对象,只能比较引用或原始值。
  • 正如吴昊所说,两个对象不能严格相等比较 { fruit : 'cherries' } === { fruit : 'cherries'} 将返回 false。所以你会变得不确定。

标签: javascript arrays object find


【解决方案1】:

您需要写入对象的完整路径并通过.符号访问对象:

const result = inventory.find(name => name.name.fruit === 'cherries');

一个例子:

const inventory = [
    { name: { vegetable: 'carrot' }, quantity: 2 },
    { name: { meat: 'pork' }, quantity: 0 },
    { name: { fruit: 'cherries' }, quantity: 5 },
  ];
  
  const result = inventory.find(name => name.name.fruit === 'cherries');
  console.log(result);

在调试器中会更好地看到你的对象属性的实际路径:

const result = inventory.find(name => {
    if(name.name.fruit === 'cherries')
        return name;
    return;
});
console.log(result);

【讨论】:

    【解决方案2】:

    您无法比较对象,因为它们有不同的引用。一种方法是使用 destructuring 并只需访问 fruit property 以便将其与给定的 value 进行比较。

    const inventory = [
      { name: { vegetable: 'carrot' }, quantity: 2 },
      { name: { meat: 'pork' }, quantity: 0 },
      { name: { fruit: 'cherries' }, quantity: 5 },
    ];
    
    const result = inventory.find(({name}) => name.fruit == "cherries");
    console.log(result);

    【讨论】:

      【解决方案3】:

      请探索Sbtree 模块或TyrDb 模块(TyrDb 是 Sbtree 之上的一个包装器,带有抽象的 API)。这些库可让您搜索嵌套元素。

      【讨论】:

        【解决方案4】:

        感谢所有建议。 我想我找到了解决问题的方法。

        我使用array.map 创建了一个仅包含名称对象 的新数组。 然后我在selectedOption 和新数组中的元素上使用JSON.stringify 来查找匹配和/或索引。

        可能有更好的方法,但这工作正常。 请随时指出我的方法中的任何潜在缺陷。

        const selectedOption = {fruit_red: "cherries", fruit_green: "kiwi"}
            
            const inventory = [
              { name: { vegetable: 'carrot' }, quantity: 2 },
              { name: { meat: 'pork' }, quantity: 0 },
              { name: { fruit_red: 'cherries', fruit_green: 'kiwi' }, quantity: 5 },
              { name: { fruit_red: 'cherries', fruit_green: 'apple' }, quantity: 3 },
            ];
            
            const names = inventory.map(item => item.name)
            
            const resultIndex = names.findIndex(name => JSON.stringify(name) === JSON.stringify(selectedOption));
            console.log(resultIndex)
            
            const result = names.find(name => JSON.stringify(name) === JSON.stringify(selectedOption));
            console.log(result)
            console.log(inventory[resultIndex])

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-26
          • 2019-09-27
          • 2017-12-24
          • 1970-01-01
          • 2015-02-12
          • 1970-01-01
          • 2021-10-04
          • 2017-09-10
          相关资源
          最近更新 更多