#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. Оно делает. Спасибо!