JavaScript-转换对象,合并

JavaScript-转换对象,合并,javascript,arrays,json,mapping,Javascript,Arrays,Json,Mapping,我正在尝试变换下面的对象。我需要创建一个独特位置的新数组,每个节点中都有位置和项目对象 在JackOfAshes的帮助下,我在这条路上走了一半 将此转换为: const orig = [ { item: { name: "cat", id: "ca_123" }, location: { name: "porch", id: "por_123" } }, { item: { name:

我正在尝试变换下面的对象。我需要创建一个独特位置的新数组,每个节点中都有位置和项目对象

在JackOfAshes的帮助下,我在这条路上走了一半

将此转换为:

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"
      }
    ]
  }
];

您可以这样做,也可以使用
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)

你太牛了非常感谢!:)