我正在尝试将两个数组合并为一个。 第一个具有默认配置,第二个具有实际配置。 我发现了非常类似的问题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
答案 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);