Как найти идентификатор объекта в массиве, имеющем только один идентифицированный атрибут «дочернего» массива

#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. Это странно. Как вы можете видеть из моего ответа, второй метод также работает просто отлично