Как найти объект из рекурсивного массива объектов, соответствующий идентификатору, используя javascript и react?

#javascript #reactjs #typescript

#javascript #reactjs #typescript

Вопрос:

у меня есть данные, подобные приведенным ниже,

 const items = [
    {
        id: '1',
        name: 'item1',
        subItems: [{
            id: '1',
            name: 'subitem-1',
        }],
    },
    {
        id: '2',
        name: 'item2',
        subItems: [{
            id: '2',
            name: 'subitem-1',
        }],
    }
]
  

Теперь я хочу найти подпункт, который соответствует идентификатору 2. таким образом, из приведенных выше данных ожидаемый результат равен

 {
    id: '2',
    name: 'subitem-1',
}
  

я пробовал что-то вроде приведенного ниже,

 const subItem = Items.find(
    (item: any) =>
        item.subItems amp;amp;
            item.subItems.some(
                (subItem: any) => subItem.id === '2'
            )
);
  

но это вернет элемент, содержащий подпункт с id = ‘2’.

как я могу исправить приведенный выше код таким образом, чтобы я получал подраздел вместо item?

может ли кто-нибудь помочь мне с этим. Спасибо.

Комментарии:

1. Будет ли когда-либо существовать только один подпункт с идентификатором 2?

2. Может ли быть только один точный подпункт или их может быть больше одного?

3. да, только один подпункт с идентификатором 2.

Ответ №1:

Вы могли бы использовать следующее, которое будет выполнять поиск и возвращать только найденный внутренний объект.

 const items = [
  {
    id: "1",
    name: "item1",
    subItems: [
      {
        id: "1",
        name: "subitem-1"
      }
    ]
  },
  {
    id: "2",
    name: "item2",
    subItems: [
      {
        id: "2",
        name: "subitem-1"
      }
    ]
  }
];

function innerFind(array, key, value) {
  for (const obj of array) {
    const item = obj.subItems.find((el) => el[key] === value);

    if (item != null) return item;
  }
}

console.log(innerFind(items, 'id', '2'));  

Вы передаете в свой массив items ключ, который вы хотите найти (‘id’), а затем значение, которое вы хотите найти (‘2’). Эта функция вернет первый найденный соответствующий подпункт.