#javascript #arrays #json #reactjs #reduce
#javascript #массивы #json #reactjs #уменьшить
Вопрос:
Я хотел бы получить помощь в разработке функции с использованием наиболее оптимизированного подхода в Javascript для поиска идентификатора «родительского» объекта, имеющего только код «дочернего» объекта (внутри массива данных).
Пример: getIdParent(«240 #code») -> вернуть «1»
[
{
id: 0,
dataArray:[
{
id: 182,
code: "182#code",
name: "Product1"
},
{
id: 183,
code: "183#code",
name: "Product2"
}
]
},
{
id: 1,
dataArray:[
{
id: 240,
code: "240#code",
name: "Product2"
},
{
id: 341,
code: "341#code",
name: "Product2"
}
]
}
]
Заранее спасибо.
Ответ №1:
На самом деле у вас здесь не так много вариантов.
Единственная реальная оптимизация, о которой я могу думать, основана на том, как часто вы ожидаете вызывать эту функцию.
Если это только один раз, вам просто нужно выполнить итерацию массива, поиск значений и возврат как можно раньше, чтобы предотвратить ненужные итерации.
function getIdParent(childCode) {
return arr.find(parent =>
parent.dataArray.some(({ code }) => code === childCode))?.id
}
Если несколько раз, вы должны создать индексированную карту дочернего code
объекта к родительскому объекту, а затем ссылаться на это
const arr = [{"id":0,"dataArray":[{"id":182,"code":"182#code","name":"Product1"},{"id":183,"code":"183#code","name":"Product2"}]},{"id":1,"dataArray":[{"id":240,"code":"240#code","name":"Product2"},{"id":341,"code":"341#code","name":"Product2"}]}]
const codeMap = arr.reduceRight((map, parent) => {
parent.dataArray.forEach(({ code }) => {
map.set(code, parent)
})
return map
}, new Map())
function getIdParent(code) {
return codeMap.get(code)?.id
}
let search = ["240#code", "182#code", "NotFound"]
search.forEach(code => {
console.log("Parent ID for", code, "=", getIdParent(code))
})
Комментарии:
1. Большое вам спасибо, Фил! В моем случае было возможно использовать только первую функцию, к которой вы обратились.
arr.find(parent => parent.dataArray.some(({ code }) => code === childCode))?.id
2. Это странно. Как вы можете видеть из моего ответа, второй метод также работает просто отлично