首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript仅将源的交叉点分配给目标对象

Javascript仅将源的交叉点分配给目标对象
EN

Stack Overflow用户
提问于 2017-10-29 20:35:08
回答 5查看 587关注 0票数 4

我有两个对象,我想要更新源中的目标对象值,但只更新目标中已经存在的值。

代码语言:javascript
复制
const target = {
    a: 1,
    b: 2,
    c: {
        c_a: 3,
        c_b: 4,
    }
}

const source = {
    a: 10,
    c: {
        c_a: 30,
        c_d: 50,
    },
    d: 60
}

const result = assignOnlyIntersection(target, source);

JSON.stringify(result)

// {
//    a: 10,
//    b: 2,
//    c: {
//        c_a: 30,
//        c_b: 4
//    }
// }

ES6中有解决这个问题的好方法吗?如果没有,lodash有这样的功能吗?如果不是,如何才能很好地解决它呢?

EN

回答 5

Stack Overflow用户

发布于 2017-10-29 21:29:17

一个简单的递归函数就可以做到:

代码语言:javascript
复制
function assignOnlyIntersection(target, source) {
    if (Object(target) !== target || Object(source) !== source)
        return source;
    for (const p in source)
        if (p in target)
            target[p] = assignOnlyIntersection(target[p], source[p]);
    return target;
}
票数 3
EN

Stack Overflow用户

发布于 2017-10-29 20:41:58

您需要遍历target对象的键,检查source对象上是否有相同的键,如果有,则替换该值。如果你在途中发现了一个对象,你也需要递归。

下面这样的代码就可以完成这项工作:

代码语言:javascript
复制
const target = { a: 1, b: 2, c: { c_a: 3, c_b: 4 }};
const source = { a: 10, c: { c_a: 30, c_d: 50 }, d: 60 };

function assignOnlyIntersection(t, s) {
    Object
        .keys(s)
        .filter(k => k in t)
        .forEach(k => {
           if (typeof t[k] === 'object') {
               assignOnlyIntersection(t[k], s[k]);
           } else {
               t[k] = s[k];
           }
    });
    
    return t;
}

const result = assignOnlyIntersection(target, source);

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

还要注意的是,如果您想要支持替换为0''之类的假值,则需要使用typeof t[k] !== 'undefined'检查是否存在。

正如@ghybs指出的,如果你也想支持用undefined值替换,你需要通过in operator k in t来检查。

票数 0
EN

Stack Overflow用户

发布于 2017-10-29 21:47:15

您可以通过检查对象来采用递归方法。

代码语言:javascript
复制
function deepAssign(target, source) {
    Object.keys(source).forEach(function (k) {
        var objectCount = [source, target]
                .map(o => o[k])
                .map(o => o && typeof o === 'object')
                .map(Boolean)
                .reduce((a, b) => a + b)

        if (!(k in target) || objectCount === 1) {
            return;
        }
        if (objectCount === 2) {
            return deepAssign(target[k], source[k]);
        }
        target[k] = source[k];
    });
    return target;
}

var source = { a: 10, c: { c_a: 30, c_d: 50, }, d: 60 },
    target = { a: 1, b: 2, c: { c_a: 3, c_b: 4, } };

console.log(deepAssign(target, source));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47000238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档