我怎样才能在javascript中以一种优雅的方式合并这两个对象(最好使用lodash)?

4zcjmb1e  于 2023-02-18  发布在  Java
关注(0)|答案(4)|浏览(99)
var object = {
  'a': {'b' : {'f' :5}, 'c' : {'e' : 6}},
  'd' : {'m' : {'n' : 10}}
};
 
var other = {
  'b': {"red" : 4},
  'c': {"red" : 10},
  'm': {"red" :5}
};

最终对象应如下所示:

var mergedObject = {
  'a': {'b' : {'f' :5 , 'red' : 4}, 'c' : {'e' : 6, 'red' : 10}},
  'd' : {'m' : {'n' : 10, 'red' : 5}}
};

我试着在lodash的merge函数中使用merge函数,但是不起作用,因为我认为这两个对象的结构不同。

wecizke3

wecizke31#

如果所有的值都是可序列化的,那么您可以使用带有“merger”回调的JSON.stringify

var object = {
    'a': {'b' : {'f' :5}, 'c' : {'e' : 6}},
    'd' : {'m' : {'n' : 10}}
};

var other = {
    'b': {"red" : 4},
    'c': {"red" : 10},
    'm': {"red" :5}
};

res = JSON.parse(
    JSON.stringify(object, (key, val) => {
        if (key in other)
            return {...val, ...other[key]}
        return val
    })
)

console.log(res)
bogh5gae

bogh5gae2#

您可以通过获取具有添加属性的条目并重新构建对象来采取一种方法。

const
    merge = (object, values) => Object.fromEntries(Object
        .entries(object)
        .map(([k, v]) => [
            k,
            v && typeof v === 'object'
                ? { ...merge(v, values), ...values[k] }
                : v
        ])
    ),
    object = { a: { b: { f: 5 }, c: { e: 6 } }, d: { m: { n: 10 } } },
    other = { b: { red: 4 }, c: { red: 10 }, m: { red: 5 } },
    merged = merge(object, other);
    
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
vybvopom

vybvopom3#

使用Object.assign方法

var object = {
    a: { b: { f: 5 }, c: { e: 6 } },
    d: { m: { n: 10 } },
};

var otherObj = {
    b: { red: 4 },
    c: { red: 10 },
    m: { red: 5 },
};

function merge(target) {
    for (const key in target) {
        if (otherObj[key]) Object.assign(target[key], otherObj[key]);
        else merge(target[key]);
    }
}
merge(object);

console.log(object);
t5fffqht

t5fffqht4#

以下是您如何在Lodash实现这一点。
您需要通过将每个子项与其查找值合并来减少每个值。

const object = {
  'a' : { 'b' : { 'f' :  5 }, 'c' : { 'e' : 6 } },
  'd' : { 'm' : { 'n' : 10 } }
};
 
const other = {
  'b' : { 'red' :  4 },
  'c' : { 'red' : 10 },
  'm' : { 'red' :  5 }
};

const mergedObject = _.reduce(object, (result, value, key) =>
  _.merge(result, {
    [key]: _.reduce(value, (acc, v, k) =>
      _.merge(acc, {
        [k]: _.merge({}, v, other[k])
      }), {})
  }), {});

console.log(mergedObject); // Merged
console.log(object);       // Unmodified
.as-console-wrapper { top: 0; max-height: 100% !important;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

相关问题