【问题标题】:Merge objects inside the two arrays using lodash使用 lodash 合并两个数组中的对象
【发布时间】:2017-06-08 06:47:40
【问题描述】:

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

【问题讨论】:

  • 也许尝试将方法而不是 'platofrm' 字符串作为第三个参数?你确定它不工作吗?似乎在这里工作-> codepen.io/kejt/pen/PWjGWa?editors=1111
  • _.merge(defaultConf, actual) 不是产生了预期的结果吗?
  • actuals 数组中的每个元素是否保证在平台上与 defaults 数组中的元素一一对应?换句话说,实际数组是否总是按顺序包含平台 X 和 Y?
  • 不可以,实际配置中顺序可以改变,只有默认配置不变。

标签: javascript arrays object merge lodash


【解决方案1】:

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

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);
      

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 为什么第一个参数是空对象?我需要我的配置作为列表,我认为这将返回一个对象作为最终结果。
    • 但这是否会像 OP 所希望的那样合并到 platform 字段上?
    • @torazaburo 不知道我是否理解问题的目的
    • 要理解我的评论,请尝试使用 [{platform: 'Z', value: false}] 的实际数组。
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2020-09-16
    • 2019-05-07
    相关资源
    最近更新 更多