Найти объект в массиве вложенных объектов - PullRequest
1 голос
/ 07 февраля 2020
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 ]

1 голос
/ 07 февраля 2020

Вам необходимо написать полный путь к объекту и доступ к объекту через . знак:

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);
0 голосов
/ 07 февраля 2020

Спасибо за все предложения. Я думаю, что нашел решение своей проблемы.

Я использовал array.map, чтобы создать новый массив, состоящий только из имен объектов . Затем я использовал JSON.stringify для selectedOption и для элементов в новом массиве, чтобы найти совпадение и / или индекс.

Возможно, есть лучший способ сделать это, но это работает нормально. Не стесняйтесь указывать на любой потенциальный fl aws в моем подходе.

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])
0 голосов
/ 07 февраля 2020

Пожалуйста, изучите модуль Sbtree или TyrDb (TyrDb - это оболочка над Sbtree с абстрагированным API). Эти библиотеки позволяют искать вложенный элемент.

0 голосов
/ 07 февраля 2020

Вы не можете сравнивать объекты, потому что они имеют разные ссылки . Одним из способов может быть использование destruuring и просто доступ к свойству 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...