用其他 json 个文件中的对象替换字符串

replace strings with object from other json files

我有 3 个 json 个文件:

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

我想 "merge" 通过替换匹配的字符串来 "merge" 所有这些文件,例如

destination_level0 -> destination_level1 -> 来源

换句话说:"Check the keys in destination_level0 e.g. "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 和下划线,但卡住了。

有什么想法吗?

纯粹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#.map inside Array#map (or lodash's _.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));