JavaScript - преобразовать объект, объединить - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь трансформировать объект ниже. Мне нужно создать новый массив уникальных локаций с локациями и объектами в каждом узле.

С помощью JackOfAshes я смог пройти половину пути в этом PEN

Преобразуйте это:

const orig = [
  {
    item: {
      name: "cat",
      id: "ca_123"
    },
    location: {
      name: "porch",
      id: "por_123"
    }
  },
  {
    item: {
      name: "dog",
      id: "do_123"
    },
    location: {
      name: "porch",
      id: "por_123"
    }
  },
  {
    item: {
      name: "snake",
      id: "sn_123"
    },
    location: {
      name: "forest",
      id: "for_123"
    }
  },
  {
    item: {
      name: "bird",
      id: "bi_123"
    },
    location: {
      name: "forest",
      id: "for_123"
    }
  },
  {
    item: {
      name: "beer",
      id: "be_123"
    },
    location: {
      name: "fridge",
      id: "fri_123"
    }
  }
];

В это:

const desired = [
  {
    name: "porch",
    id: "por_123",
    items: [
      {
        name: "cat",
        id: "ca_123"
      },
      {
        name: "dog",
        id: "do_123"
      }
    ]
  },
  {
    name: "forest",
    id: "for_123",
    items: [
      {
        name: "snake",
        id: "sn_123"
      },
      {
        name: "bird",
        id: "bi_123"
      }
    ]
  },
  {
    name: "fridge",
    id: "fri_123",
    items: [
      {
        name: "beer",
        id: "be_123"
      }
    ]
  }
];

1 Ответ

1 голос
/ 26 мая 2020

Вы можете это сделать, или используйте reduce

const orig = [
  {
    item: {
      name: "cat",
      id: "ca_123"
    },
    location: {
      name: "porch",
      id: "por_123"
    }
  },
  {
    item: {
      name: "dog",
      id: "do_123"
    },
    location: {
      name: "porch",
      id: "por_123"
    }
  },
  {
    item: {
      name: "snake",
      id: "sn_123"
    },
    location: {
      name: "forest",
      id: "for_123"
    }
  },
  {
    item: {
      name: "bird",
      id: "bi_123"
    },
    location: {
      name: "forest",
      id: "for_123"
    }
  },
  {
    item: {
      name: "beer",
      id: "be_123"
    },
    location: {
      name: "fridge",
      id: "fri_123"
    }
  }
];

let formattedData = {}

orig.forEach(data=>{
  if(!formattedData[data.location.id]) formattedData[data.location.id]= {
    id: data.location.id,
    name: data.location.name,
    items:[]
  }
  formattedData[data.location.id].items.push(data.item)
})

const finalResponse = Object.entries(formattedData).map((e) => ( { ...e[1] } ));
console.log(finalResponse)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...