使用lodash合并两个数组中的对象

时间:2017-01-23 17:06:44

标签: javascript arrays object merge lodash

我正在尝试将两个数组合并为一个。 第一个具有默认配置,第二个具有实际配置。 我发现了非常类似的问题here,但在我的具体情况下它不起作用。

默认配置:

[
  { configurationOption: 'X provisioning', platform: 'X', value: true },
  { configurationOption: 'Y provisioning', platform: 'Y', value: true },
  { configurationOption: 'Z provisioning', platform: 'Z', value: true }
]

实际配置:

[
  { platform: 'X', value: false },
  { platform: 'Y', value: true }
]

预期结果:

[
  { configurationOption: 'X provisioning', platform: 'X', value: false },
  { configurationOption: 'Y provisioning', platform: 'Y', value: true },
  { configurationOption: 'Z provisioning', platform: 'Z', value: true }
]

所以它基本上需要做的是更新默认配置的'value'属性,基于实际的属性,棘手的部分是实际配置中不存在一些configurationItem,实际配置缺少'configurationOption'属性。

var config = _.unionBy(actual, defaultConf, 'platform');

这一行是我能得到的最接近的行,但缺少'configurationOption'属性。

以下是CodePen,您可以使用它:https://codepen.io/anon/pen/oBwLMb?editors=0012

2 个答案:

答案 0 :(得分:1)

根据defaults创建一个新的对象数组,其中的每个元素都是根据匹配actuals将该默认值与platform中找到的相应实际数据合并的结果。

const defaults = [
  {configurationOption: 'X provisioning', platform: 'X', value: true}, 
  {configurationOption: 'Y provisioning', platform: 'Y', value: true}, 
  {configurationOption: 'Z provisioning', platform: 'Z', value: true}];

const actuals = [
  {platform: 'X', value: false}, 
  {platform: 'Y', value: true}];

var result = defaults.map(deflt => Object.assign(
  {}, 
  deflt, 
  actuals.find(actual => actual.platform === deflt.platform)));

console.log(result);
      

如果您愿意,可以使用_.map_.assign_.find使用lodash重写。

答案 1 :(得分:1)

您可以使用_.merge()。所以你的代码可以写成:

var config = _.merge({}, defaultConf, actual);
console.log(config);  

http://jsbin.com/yuyegamaka/edit?js,console

更新:如果你想要数组作为结果,那么

var config = _.merge([], defaultConf, actual);