在嵌套对象数组中查找对象

时间:2020-02-07 07:25:23

标签: javascript arrays object find

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' }对象的对象,但是结果是未定义。

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您无法比较对象,因为它们具有不同的引用。一种方法可能是使用 destructuring ,而只是访问fruit 属性以便将其与给定的进行比较。 >

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);

答案 2 :(得分:0)

请浏览Sbtree模块或TyrDb模块(TyrDb是具有抽象API的Sbtree的包装)。这些库使您可以搜索嵌套元素。

答案 3 :(得分:0)

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

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

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

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])