【问题标题】:How to deep merge ES6 Maps?如何深度合并 ES6 Maps?
【发布时间】:2020-08-28 13:19:12
【问题描述】:

这个问题合并了:P以下两个问题:

如何深度合并地图?

(优秀的deepmerge库好像不支持地图)

【问题讨论】:

  • 在我的场景中,它嵌套映射到对象的最终级别。如果对象没有深度合并,那对我来说很好。但最好能得到一个尽可能笼统的答案。
  • 只加入你找到的两种方法?请发布您尝试过的代码。

标签: javascript ecmascript-6


【解决方案1】:

好吧,@Bergi 的评论当然是对的,我应该提供我的解决方案尝试。 到目前为止,我最好的版本如下。当我发现更好的东西时,我会更新。 (编辑:更新,现在有重载和打字):

function merge<K>(a:K, b:K):K;
function merge<T, K>(a: Map<T, K>, b: Map<T, K>): Map<T, K>;
function merge<T, K>(a: Map<T, K>, b: Map<T, K>):any{

    // overload 1
    if (!(typeof (a) == "object")) {
        return b;
    }
    if (!(typeof (b) == "object")) {
        return a;
    }

    // overload 2
    let merged = new Map();
    a.forEach((a_value, key)=>{
        const b_value = b.get(key);
        if(b_value){
            merged.set(key, merge(a_value, b_value));
        }
        else{
            merged.set(key, a_value);
        }
    })
    b.forEach((b_value, key)=>{
        const a_value = a.get(key);
        if(!a_value){
            merged.set(key, b_value);
        }
    })
    return merged;
}



let a = new Map<string, Map<string, number>>();
a.set('a', new Map(Object.entries({ 'c': 1 })));
a.set('b', new Map(Object.entries({ 'c': 1 })));
let b = new Map<string, Map<string, number>>();
b.set('b', new Map(Object.entries({ 'd': 2 })));

let merged = merge(a,b);
console.log(merged)

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 2015-03-12
    • 2021-03-13
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多