JS Самый быстрый способ переместить объекты внутри массива в тело родительского объекта, индексированного по имени свойства? - PullRequest
0 голосов
/ 12 июля 2020

У меня есть объект, который содержит массив других объектов. Моя цель - переместить объекты из массива pets в тело объекта person. Я знаю, что это легко сделать, используя Object.assign. Я мог бы выполнить итерацию и сделать это вручную, но я ищу удобный способ (ES2020 \ TS) для достижения той же цели, но вместо того, чтобы помещать объекты в ключ numeri c по умолчанию, чтобы поместить объект в ключ на основе свойства name? Если свойство уже существует, добавить к ключу «_1»?

текущий код:

    let person = { name: "jon", pets: [{name: "daenerys ", type: "dragon_red"},
                                       {name: "daenerys ", type: "dragon_black"},
                                       {name: "sandor", type: "hound"},
                                       {name: "bran", type: "raven"}]};
    
    
    Object.assign(person, person.pets);
    
0: {name: "daenerys ", type: "dragon_red"}
1: {name: "daenerys ", type: "dragon_black"}
2: {name: "sandor", type: "hound"}
3: {name: "bran", type: "raven"}
name: "jon"
pets: (4) [{…}, {…}, {…}, {…}]

Требуемые результаты:
daenerys : {name: "daenerys ", type: "dragon_red"}
daenerys_1 : {name: "daenerys ", type: "dragon_black"}
sandor: {name: "sandor", type: "hound"}
bran: {name: "bran", type: "raven"}
name: "jon"
pets: (4) [{…}, {…}, {…}, {…}]

Ответы [ 2 ]

1 голос
/ 12 июля 2020

если ваш name повторяется более одного раза

let person = {
    name: "jon",
    pets: [
        { name: "daenerys ", type: "dragon_red" },
        { name: "daenerys ", type: "dragon_black" },
        { name: "daenerys ", type: "dragon_white" },
        { name: "sandor", type: "hound" },
        { name: "bran", type: "raven" }
    ]
};

const fn = (obj) => {
    const arr = {};
    obj.pets.map((item) => {
        let index = 0;
        let name = item.name;
        while (arr[name]) {
            index++;
            name = index === 0 ? item.name : item.name + `_${index}`
        }
        arr[name] = item;
    })
    return { ...arr, ...obj };
}

console.log(fn(person));
0 голосов
/ 12 июля 2020

попробуйте это

let person = { 
  name: "jon",
  pets: 
  [
    {name: "daenerys", type: "dragon_red"},
    {name: "daenerys", type: "dragon_black"},
    {name: "sandor", type: "hound"},
    {name: "bran", type: "raven"}
   ]
};
                                       
                                       
person.pets.forEach(element =>{
  if(person[element.name] ==null){
      person[element.name] = element;
  }
  else{
   person[element.name +"_1"] = element;
  }
});
console.log(person);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...