Как получить объект из одного ключа,значение в массиве

#javascript #arrays #arraylist

Вопрос:

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

 function iterate(array, prop, val) {  Object.keys(array).forEach((key) =gt; {  if (key === prop amp;amp; val === array[key]) {  console.log(`key: ${key}, value: ${array[key]}`);  }   if (typeof array[key] === 'object') {  iterate(array[key], prop, val);  }  }); }  

Это нормально, но теперь я хотел бы получить доступ к полному содержимому этого конкретного объекта, где были найдены эти свойства и значения. Это мой JSON:

 [  {  "page":"main",  "content":[  {  "type":"item",  "item":[  {  "name":"HAMMER",  "price":"1000"  },  {  "name":"SWORD",  "price":"2000"  }  ]  }  ]  } ]  

Это то, что я ищу/получаю с помощью своей функции:

 "name":"HAMMER"  

И это то, что мне нужно:

 {  "name":"HAMMER",  "price":"1000" },  

Есть ли какой-либо способ достичь этого, или я рассматриваю эту проблему с неправильной точки зрения?

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

1. Вместо регистрации найденного ключа/значения return array; (которое, кстати, не является массивом)

2. Это работает, и это объект, верно? Не массив. Спасибо!

3. @ChrisG, который на самом деле ничего не вернет из iterate

4. @VLAZ Правильно, я должен, возможно, взглянуть на фактический код 😉

Ответ №1:

Вы можете использовать базовый цикл, чтобы найти элемент из глубокого вложенного объекта…

 let data = [{ "page": "main", "content": [{ "type": "item", "item": [{ "name": "HAMMER", "price": "1000" }, { "name": "SWORD", "price": "2000" }] }] }] let [prop, value] = ["name", "HAMMER"]  loop: for (let page of data) {  for (let type of page.content) {  let found = type.item.find(v =gt; v[prop] === value);  if (found) {  console.log(found)  break loop;  }  } } 

хотели бы вы выполнить рекурсивный поиск? Тогда вы можете использовать генератор…

 let data = [{ "page": "main", "content": [{ "type": "item", "item": [{ "name": "HAMMER", "price": "1000" }, { "name": "SWORD", "price": "2000" }] }] }]  function* iterate(arrayLike, prop, value) {  for (let page of arrayLike) {  if (page[prop] == value)  yield page;   for (let v of Object.values(page)) {  if (Array.isArray(v))  yield* iterate(v, prop, value)  }  } }  for (let item of iterate(data, "name", "HAMMER")) {  console.log(item) } 

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

1. Это тоже неплохой подход, но хитрость заключалась в том, чтобы просто изменить журнал, чтобы получить весь массив, а не отфильтрованный массив. Спасибо!

2. это не фильтрация , а поиск определенного элемента, так что вы искали рекурсивную итерацию?

3. Если это так , я обновлю свой вопрос

4. Нет, я имею в виду свой код, который я отфильтровал. У тебя все работает нормально. И да, я искал рекурсивную итерацию.

5. Оно делает. Спасибо!