【问题标题】:JS create a new array of objects with new keyJS 使用新键创建一个新的对象数组
【发布时间】:2018-09-25 17:07:17
【问题描述】:

所以我有两个 JSON 对象数组,房间和预订。我想输出一个新的对象数组,其中包含来自这两个数组的数据和一个新的数据类型。不确定如何创建新的数据类型。

var rooms = [
     {id:1, room:'treehouse'},
     {id:2, room:'casa'},
     {id:3, room:'vacation'},
     {id:4, room:'presidential'}
];

var reservations = [
  {id:1, roomID:'2', time:'2pm', location:'rome'},
  {id:2, roomID:'3', time:'4pm', location:'paris'},
  {id:3, roomID:'1', time:'4pm', location:'london'},
  {id:4, roomID:'2', time:'7pm', location:'rome'},
  {id:5, roomID:'1', time:'12pm', location:'london'},
  {id:6, roomID:'4', time:'4pm', location:'berlin'}
];

期望的输出:

var bookings = [
  {id: 1, roomid:1, time:'12pm',location:'london', roomname:'treehouse'},
  {id: 2, roomid:1, time:'4pm', location:'london', roomname:'treehouse'},
  {id: 3, roomid:2, time:'2pm', location:'rome', roomname:'casa'},
  {id: 4, roomid:2, time:'7pm', location:'rome', roomname:'casa'},
  {id: 5, roomid:3, time:'4pm', location:'paris', roomname:'vacation'},
  {id: 6, roomid:4, time:'4pm', location:'berlin', roomname:'presidential'}
]

我对如何做到这一点的逻辑感到困惑。我正在考虑遍历 reservations 数组,并为每个预订抓取 roomId 并检查房间的地图结构,然后输出。我不太确定该怎么做。

【问题讨论】:

  • roomid 还是roomID?为什么类型不同一个是数字,一个是字符串。

标签: javascript arrays


【解决方案1】:

var rooms = [
     {id:1, room:'treehouse'},
     {id:2, room:'casa'},
     {id:3, room:'vacation'},
     {id:4, room:'presidential'}
];

var reservations = [
  {id:1, roomID:'2', time:'2pm', location:'rome'},
  {id:2, roomID:'3', time:'4pm', location:'paris'},
  {id:3, roomID:'1', time:'4pm', location:'london'},
  {id:4, roomID:'2', time:'7pm', location:'rome'},
  {id:5, roomID:'1', time:'12pm', location:'london'},
  {id:6, roomID:'4', time:'4pm', location:'berlin'}
];

console.log(
  reservations.map(a=>({...a, roomname: rooms.find(b=>b.id==a.roomID).room}))
)

【讨论】:

    【解决方案2】:

    您可以讲述Map 的力量并获取新对象的附加信息。

    var rooms = [{ id: 1, room: 'treehouse' }, { id: 2, room: 'casa' }, { id: 3, room: 'vacation' }, { id: 4, room: 'presidential' }],
        roomMap = new Map(rooms.map(({ id: roomid, room: roomname }) => [roomid, { roomname }])),
        reservations = [{ id: 1, roomID: '2', time: '2pm', location: 'rome' }, { id: 2, roomID: '3', time: '4pm', location: 'paris' }, { id: 3, roomID: '1', time: '4pm', location: 'london' }, { id: 4, roomID: '2', time: '7pm', location: 'rome' }, { id: 5, roomID: '1', time: '12pm', location: 'london' }, { id: 6, roomID: '4', time: '4pm', location: 'berlin' }],
        bookings = reservations.map(o => Object.assign({}, o, roomMap.get(+o.roomID)));
    
    console.log(bookings);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      你可以使用

      reservations.map(function (val) {
          return Object.assign(val, rooms.find(function (item) {
              return val.roomID === item.id ? item : {}
          }))
      })
      

      让我知道这是否适合您。

      【讨论】:

        【解决方案4】:

        您可以使用Array.reduce() 创建带有房间名称的id 地图的地图,然后在预订时使用Array.map() 将具有给定ID 的房间与房间名称合并:

        var rooms = [ {id:1, room:'treehouse'}, {id:2, room:'casa'}, {id:3, room:'vacation'}, {id:4, room:'presidential'} ];
        
        var reservations = [ {id:1, roomID:'2', time:'2pm', location:'rome'}, {id:2, roomID:'3', time:'4pm', location:'paris'}, {id:3, roomID:'1', time:'4pm', location:'london'}, {id:4, roomID:'2', time:'7pm', location:'rome'}, {id:5, roomID:'1', time:'12pm', location:'london'}, {id:6, roomID:'4', time:'4pm', location:'berlin'} ];
        
        let roomMap = rooms.reduce((a,curr)=>{
          a[curr.id] = {roomname : curr.room};
          return a;
        },{});
        let result = reservations.map((o)=> Object.assign({},o,roomMap[o.roomID]));
        console.log(result);

        【讨论】:

          【解决方案5】:

          var reservations = [
            {id:1, roomID: 2, time:'2pm', location:'rome'},
            {id:2, roomID: 3, time:'4pm', location:'paris'},
            {id:3, roomID: 1, time:'4pm', location:'london'},
            {id:4, roomID: 2, time:'7pm', location:'rome'},
            {id:5, roomID: 1, time:'12pm', location:'london'},
            {id:6, roomID: 4, time:'4pm', location:'berlin'}
          ];
          
          var rooms = [
               {id:1, room:'treehouse'},
               {id:2, room:'casa'},
               {id:3, room:'vacation'},
               {id:4, room:'presidential'}
          ];
          reservations.forEach(reservation => {
            reservation.roomname = rooms.find(({id}) => id === reservation.roomID).room;
          })
          
          console.log(reservations);

          【讨论】:

            【解决方案6】:

            您可以使用Array.prototype.reduceArray.prototype.map 创建一个查找,以迭代reservations 数组并构造所需的输出:

            var rooms = [{id:1, room:'treehouse'},{id:2, room:'casa'},{id:3, room:'vacation'},{id:4, room:'presidential'}];
            
            var reservations = [{id:1, roomID:'2', time:'2pm', location:'rome'},{id:2, roomID:'3', time:'4pm', location:'paris'},{id:3, roomID:'1', time:'4pm', location:'london'},{id:4, roomID:'2', time:'7pm', location:'rome'},{id:5, roomID:'1', time:'12pm', location:'london'},{id:6, roomID:'4', time:'4pm', location:'berlin'}];
            
            var roomHash = rooms.reduce((all, {id, room}) => ({...all, [id]: room }), {});
            
            var result = reservations.map(item => ({...item, room: roomHash[item.roomID]}));
            
            console.log(result);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-01-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-10
              • 2018-10-28
              • 2019-02-28
              相关资源
              最近更新 更多