【问题标题】:replace strings with object from other json files用其他 json 文件中的对象替换字符串
【发布时间】:2016-12-11 07:09:04
【问题描述】:

我有 3 个 json 文件:

  1. sources.json
  2. destination_level1.json
  3. destination_level0.json(最终文件)

我想通过替换匹配的字符串来“合并”所有这些文件,例如

destination_level0 -> destination_level1 -> 来源

用词:“检查destination_level0中的键,例如“Element1”,转到destination_level1并查找匹配的对象并将destination_level0中的Element1替换为该对象。”从destination_level1 到源也是如此。

来源可能如下所示:

{"john": ["A","B"],"mike": ["123","234","345"],"doe": ["abc","cde"],"ann": {"abc": ["yxc","xcv","cvb"],"bcd": ["poi","iuz","uzt"]}}

destination_level_1 像这样:

{"Element1": ["john","ann","john","john","doe","mike"],"Element2": ["ann","mike","ann","doe","doe","doe","ann"],"Element3": ["ann","doe","ann"]}

destination_level_0 像这样:

{"FinalA": ["Element1","Element2","Element1","Element2","Element2"],"FinalB": ["Element2","Element2","Element2","Element1"]}

最终的结果应该是这样的:

{"FinalA": [[["A","B"],{"abc": ["yxc","xcv","cvb"],"bcd": ["poi","iuz","uzt"]},...

我尝试了一些 lodash 和下划线,但卡住了。

有什么想法吗?

【问题讨论】:

  • element2从何而来? finalB从哪里来?关系不清楚!
  • element2 在destination_level0.json 中手动定义。 finalB 也一样。 element2 应替换为 destination_level_1 中 element2 的对象。 finalB 不需要替换,因为这是我们将使用的最终“密钥”。我希望澄清一下?

标签: javascript json node.js underscore.js lodash


【解决方案1】:

仅在纯 JavaScript 中

var sources = {"john": ["A","B"],"mike": ["123","234","345"],"doe": ["abc","cde"],"ann": {"abc": ["yxc","xcv","cvb"],"bcd": ["poi","iuz","uzt"]}};
    var destination_level_0 = {"FinalA": ["Element1","Element2","Element1","Element2","Element2"],"FinalB": ["Element2","Element2","Element2","Element1"]};
    var destination_level_1 = {"Element1": ["john","ann","john","john","doe","mike"],"Element2": ["ann","mike","ann","doe","doe","doe","ann"],"Element3": ["ann","doe","ann"]};
    
    var final = {};
    for(var key in destination_level_0){
        var preFinal = [];
        var elems = destination_level_0[key];
        for(var i in elems){
            var elem = elems[i];
            var names = destination_level_1[elem];
            for(var j in names){
                var name = names[j];
                var finalItem = sources[name];
                preFinal.push(finalItem); 
            }
        }
        final[key] = preFinal;
    }
    
    console.log(final);
    console.log(JSON.stringify(final));

【讨论】:

  • 非常感谢......我让它工作了 - 主要是:还有一件事:我如何能够将最低级别嵌套在上面级别的“array-item”中?例如。正确的不是看起来像这样:例如对于 FinalA -> john: {"FinalA": [["A","B"],{"abc": ["yxc","xcv","cvb"],"bcd": ["poi", "iuz","uzt"]},["A","B"],["A","B"],["abc","cde"],... 我确实需要 "源”嵌套在一项数组项下,例如FinalY -> Element1 -> john {"FinalA": [[["A","B"],{"abc": ["yxc","xcv","cvb"],"bcd": ["poi ","iuz","uzt"]},["A","B"],["A","B"]],["abc","cde"], 知道吗?
  • 对不起,我没有得到你的问题。您可以使用所需输出的示例编辑上面发布的问题吗?
  • 我想我明白了 - 再次感谢您的帮助!
【解决方案2】:

Array#map(或lodash的_.map())中使用Array#.map从level0 => level1 => level2映射一个项目:

var level0 = {"FinalA": ["Element1","Element2","Element1","Element2","Element2"],"FinalB": ["Element2","Element2","Element2","Element1"]};
var level1 = {"Element1": ["john","ann","john","john","doe","mike"],"Element2": ["ann","mike","ann","doe","doe","doe","ann"],"Element3": ["ann","doe","ann"]};
var level2 = {"john": ["A","B"],"mike": ["123","234","345"],"doe": ["abc","cde"],"ann": {"abc": ["yxc","xcv","cvb"],"bcd": ["poi","iuz","uzt"]}}
;

var result = Object.keys(level0).reduce(function(r, key) {
  r[key] = level0[key].map(function(element) {
    return level1[element].map(function(item) {
      return level2[item];
    });
  }) 
  
  return r;
}, Object.create(null));

console.log(JSON.stringify(result));

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多