【问题标题】:merge 3 different json array objects into a single json array based on key values in javascript基于javascript中的键值将3个不同的json数组对象合并为一个json数组
【发布时间】:2021-12-13 17:56:44
【问题描述】:

我正在尝试根据 JavaScript 中的基本 json 对象中的键值将 3 个不同的 json 数组对象合并为一个对象。我以前没有尝试过这样的事情。 数据看起来像这样。

var baseObj = [
  { "miId": 1, "val": 2, "smiList": [ { "smiId": '1a', "val": 3 }, { "smiId": '1b', "val": 4 } ] },
  { "miId": 2, "val": 22, "smiList": [ { "smiId": '2a', "val": 33 }, { "smiId": '2b', "val": 43 } ] }
]

var obj1 = [ 
    { "miId": 1, "val": 23, "smiList": [ { "smiId": '1a', "val": 13 }, { "smiId": '1c', "val": 14 } ] },
     { "miId": 4, "val": 24, "smiList": [ { "smiId": '2a', "val": 33 }, { "smiId": '2b', "val": 43 } ] }
]

var obj2 = [ 
    { "miId": 11, "val": 22, "smiList": [ { "smiId": '1a', "val": 53 }, { "smiId": '1c', "val": 14 } ] },
    { "miId": 2, "val": 43, "smiList": [ { "smiId": '2a', "val": 6 }, { "smiId": '2b', "val": 7 } ] }
]

我的结果必须基于基本 json 及其键值。它基本上就像带有 baseobj 数组的 obj1 和 obj2 的左侧。我需要根据它们的键获取 baseObj 的所有对象以及 obj1 和 obj2 的匹配值。

结果必须是:

var resultObj = [
  { "miId": 1, "val": 2, "obj1Val" :23, "smiList": [ {"smiId": '1a', "val": 3, "obj1Val": 13}, { "smiId": '1b', "val": 4 } ] },
  { "miId": 2, "val": 22, "obj2Val" :43, "smiList": [ { "smiId": '2a', "val": 33, "obj2Val" :6}, { "smiId": '2b', "val": 43, "obj2Val" :7, } ] }
]

任何人都可以帮助我如何实现上述结果。提前致谢。

【问题讨论】:

  • JSON 只是一个字符串。您正在处理数组内的对象。你试过什么?
  • 嗨@Nina Scholz,我尝试遍历数组,但没有成功获得结果。如果您对上述问题有任何解决方案,请您帮助我。提前致谢。
  • 展示您的尝试,也许我们可以帮助您

标签: javascript arrays array-merge json-arrayagg


【解决方案1】:

我以前从未尝试过这样的事情。

把你的大问题分解成小问题,然后尝试解决小问题,它会自行解决......

var baseObj = [{ "miId": 1, "val": 2, "smiList": [{ "smiId": '1a', "val": 3 }, { "smiId": '1b', "val": 4 }] }, { "miId": 2, "val": 22, "smiList": [{ "smiId": '2a', "val": 33 }, { "smiId": '2b', "val": 43 }] }]
var obj1 = [{ "miId": 1, "val": 23, "smiList": [{ "smiId": '1a', "val": 13 }, { "smiId": '1c', "val": 14 }] }, { "miId": 4, "val": 24, "smiList": [{ "smiId": '2a', "val": 33 }, { "smiId": '2b', "val": 43 }] }]
var obj2 = [{ "miId": 11, "val": 22, "smiList": [{ "smiId": '1a', "val": 53 }, { "smiId": '1c', "val": 14 }] }, { "miId": 2, "val": 43, "smiList": [{ "smiId": '2a', "val": 6 }, { "smiId": '2b', "val": 7 }] }]
function marge(baseObj, entrys, _id) {
    for (let base of baseObj) {
        for (let [key, obj] of entrys) {
            let item = obj.find(o => o[_id] == base[_id])
            if (!item) continue;
            base[key] = item.val;
            marge(base.smiList || [], [[key, item.smiList]], "smiId")
        }
    }
}
marge(baseObj, [["obj1Val", obj1], ["obj2Val", obj2]], "miId")
console.log("resultObj:", baseObj)

【讨论】:

  • 嗨@Nur,感谢您的回答。它在 Chrome 中按预期工作,但在 IE11 中出现错误。你能帮忙吗?
  • 在Internet Explorer中没有任何作用,您应该知道浏览器支持哪些功能,如果您真的想针对Internet Explorer,那么您应该使用Type-Script,Babel等工具在es3中对其进行转译...还有许多 polyfill 可用于支持缺失的功能...
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2018-04-01
  • 2021-01-27
相关资源
最近更新 更多