【问题标题】:How to merge two objects with different structure in javascript如何在javascript中合并具有不同结构的两个对象
【发布时间】:2017-02-11 17:26:40
【问题描述】:

我有两个不同结构的对象,试图将这两个对象与基于键值的匹配数据合并,并用来自object1和object2的完整数据创建一个新对象。

我的对象1

{  
   "schedule":{  
      "onward":{  
         "journey":[  
            {  
               "trips":[  
                  {  
                     "origin":{  
                        "airportCode":"AMS"
                     },
                     "destination":{  
                        "airportCode":"BCN"
                     },
                     "FlightNumber":"KL1665"
                  }
               ]
            },
            {  
               "trips":[  
                  {  
                     "origin":{  
                        "airportCode":"AMS"
                     },
                     "destination":{  
                        "airportCode":"BCN"
                     },
                     "FlightNumber":"MF9343"
                  }
               ]
            }
         ]
      }
   }
}

对象 2

{  
   "flights":[  
      {  
         "flightNumber":"KL1665",
         "price":223,
         "available":10
      },
      {  
         "flightNumber":"KL112",
         "price":223,
         "available":10
      },
      {  
         "flightNumber":" KL112",
         "price":223,
         "available":10
      }
   ]
}

我想将“price”和“available”合并到与“flightNumber”匹配的对象,并创建一个包含所有数据的新对象。

我曾尝试使用 loadash 和下划线,但无法理解。帮助会很棒,在此先感谢。

【问题讨论】:

  • 最终预期对象{"schedules": {"onwardSchedules": {"trips": [{"flights": [{"origin": {"airportCode": "AMS"}, "destination": {"airportCode": "BCN"}, "marketingFlightNumber": "KL1665","price":223, "available": 10 }] }, {"flights": [{ "origin": { "airportCode": "AMS"}, "destination": {"airportCode": "BCN" } , "marketingFlightNumber": "MF9343" }] }] } } }
  • 您只需要手动执行此操作。将您想要的航班数据放入计划中。对于这种特定的事情没有“捷径”。
  • @bryan60 我从 Ajax 动态获取此数据,因此无法手动更新。
  • 我的意思是你需要编写代码来手动将这些与循环结合起来。没有类似 lodash 或 underscore 之类的插件解决方案。

标签: javascript jquery arrays json javascript-objects


【解决方案1】:

2个简单的forEach就可以了:-

flights.flights.forEach(function(e, i) {
  schedule.schedule.onward.journey.forEach(function(e2, i2) {
    if (e.flightNumber == e2.trips[0].FlightNumber) {
      e2.trips[0] = $.extend(e, e2.trips[0]);
    }
  });
});

工作示例:

var schedule = {
  "schedule": {
    "onward": {
      "journey": [{
        "trips": [{
          "origin": {
            "airportCode": "AMS"
          },
          "destination": {
            "airportCode": "BCN"
          },
          "FlightNumber": "KL1665"
        }]
      }, {
        "trips": [{
          "origin": {
            "airportCode": "AMS"
          },
          "destination": {
            "airportCode": "BCN"
          },
          "FlightNumber": "MF9343"
        }]
      }]
    }
  }
};

var flights = {
  "flights": [{
      "flightNumber": "KL1665",
      "price": 223,
      "available": 10
    }, {
      "flightNumber": "KL112",
      "price": 223,
      "available": 10
    }, {
      "flightNumber": " KL112",
      "price": 223,
      "available": 10
    }

  ]
};

flights.flights.forEach(function(e, i) {
  schedule.schedule.onward.journey.forEach(function(e2, i2) {
    if (e.flightNumber == e2.trips[0].FlightNumber) {
      e2.trips[0] = $.extend(e, e2.trips[0]);
    }
  });
});

console.log(schedule);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • 非常感谢您的回复,能否请您提出一种方法,使我可以得到与对象 1 相同结构的最终对象
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2017-09-28
相关资源
最近更新 更多