【问题标题】:Node JS - merging objects by their keys where keys are not knownNode JS - 通过它们的键合并对象,其中键是未知的
【发布时间】:2019-05-23 13:47:31
【问题描述】:

我有一堆从 Mongo 数据库中获取的数据。 简而言之,我的数据如下所示:

var a = [{
  "F1": [
    "value1"
  ]
}];

var b = [{
  "8002": [
    "value3",
    "value4"
  ]
}];

var c = [{
    "F1": [
      "value1",
      "value3"
    ]
  },
  {
    '8002': [
      "value5"
    ]
  }
];

a = a.concat(b).concat(c);
console.log(a);

当我结合这些我得到:

[
  { 'F1': ['value1'] },
  { '8002': ['value3', 'value4'] },
  { 'F1': ['value1', 'value3'] },
  { '8002': ['value5'] }
]

但我需要的是:

[ 
   { 'F1': [ 'value1','value3' ] },
   { '8002': [ 'value3', 'value4','value5' ] }
]

唯一键的值合并的地方。 Node/JavaScript 是如何实现的?

【问题讨论】:

  • 这些是 JavaScript 对象。 JSON 是一种序列化格式,其中数据被转换为 text.
  • 您是否总是拥有相同的结构,例如数组、对象、带有数组的单个属性?
  • 为什么不能直接从mongo中提取必要的数据结构?
  • 为了清楚起见,我重写了这个问题并添加了一个 sn-p。
  • @NinaScholz 是的.. 结构是一样的

标签: javascript arrays node.js


【解决方案1】:

您可以减少给定的数组并检查结果集中是否存在相同的键,然后检查值是否存在,然后将值推送到结果集中。

var a = [{ F1: ["value1"] }],
    b = [{ 8002: ["value3", "value4"] }],
    c = [{ F1: ["value1", "value3"] }, { 8002: ["value5"] }],
    result = [...a, ...b, ...c].reduce((r, o) => {
        var key = Object.keys(o)[0],
            temp = r.find(p => key in p);

        if (!temp) return r.concat(o);
        o[key].forEach(v => {
            if (!temp[key].includes(v)) temp[key].push(v);
        });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

带有集合的地图。

var a = [{ F1: ["value1"] }],
    b = [{ 8002: ["value3", "value4"] }],
    c = [{ F1: ["value1", "value3"] }, { 8002: ["value5"] }],
    result = Array.from(
        [...a, ...b, ...c].reduce((m, o) => {
            var [k, v] = Object.entries(o)[0];
            return m.set(k, new Set([...(m.get(k) || []), ...v]));
        }, new Map),
        ([k, v]) => ({ [k]: [...v] })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    你可以使用reduce()来做到这一点

    var a =[ { "F1" : [ "value1" ] } ]; 
    var b =[ { "8002" : [ "value3", "value4" ] } ]; 
    var c =[ { "F1" : [ "value1", "value3" ] }, { '8002': [ "value5" ] } ];
        
    let arr = [...a,...b,...c];
    
    let res = arr.reduce((ac,a) => {
      let key = Object.keys(a)[0];
      ac[key] = (ac[key] || []).concat(a[key]);
      return ac;
    })
    
    res = Object.entries(res).map(([k,v]) => ({[k]:v}))
    
    console.log(res)

    【讨论】:

      猜你喜欢
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2020-05-04
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多