深度将一个对象中的值替换为另一个对象 - javascript

时间:2017-11-02 04:36:16

标签: javascript node.js loops object lodash

您好我正在使用javascript / node.js。我有两个数据对象。 (请注意,真实对象比这复杂得多。)

    const original = {
        'totAmount': 10,
        'testVal': 'zzzzzzzz',
        'potentialPaid': 10,
        'depositAmount': 10,
        'payment': {
            'amount': 10,
             'testVal': 'zzzzzzzz',
            'details': {
                'amount': 10,
                'testVal': 'zzzzzzzz',
                'statusHistory': {
                    'amount': 10,
                    'testVal': 'zzzzzzzz'
                }
            }
        },
        'coupon': {'test': 1000}
    };

const dataToUpdate = {
        'totAmount': 65,
        'potentialPaid': 65,
        'depositAmount': 65,
        'payment': {
            'amount': 65,
            'details': {
                'amount': 65,
                'statusHistory': {
                    'amount': 65
                }
            }
        },
        'coupon': {}
    };

我希望使用相同的密钥替换original中的dataToUpdate中的所有值。

我的预期结果是

    const original = {
        'totAmount': 65,
        'testVal': 'zzzzzzzz',
        'potentialPaid': 65,
        'depositAmount': 65,
        'payment': {
            'amount': 65,
            'testVal': 'zzzzzzzz',
            'details': {
                'amount': 65,
                 'testVal': 'zzzzzzzz',
                'statusHistory': {
                    'amount': 65,
                    'testVal': 'zzzzzzzzz
                }
            }
        },
        'coupon': {}
    };
  • 原始对象中具有相同键的所有值都应替换为其他对象值。

我在Object.assign()和其他许多人看过.merge lodash等各种解决方案。

我现在已经坚持了3个多小时,但仍然无法找到任何解决方案。

有没有可用的默认javascript函数做这种事情? , 请帮忙。

提前致谢。

3 个答案:

答案 0 :(得分:2)

经过一些研究后,我发现版本4.0.0 lodash有一个mergeWith函数,可以让你为合并应用自定义条件。

我在这里添加了一个适用于您的示例的jsfiddle,但可能需要稍微调整以涵盖其他一些场景(我不确定)。

jsfiddle中允许您自定义合并标准的函数是:

function customizer(objValue, srcValue) {
  if (_.isEmpty(srcValue)) {
    return srcValue;
  }
  else {
    _.merge(objValue, srcValue);
  }
}

这是jsfiddle:

http://jsfiddle.net/q9g2L60g/

我希望这会有所帮助。

答案 1 :(得分:1)

Lodash的_.mergeWith()是开箱即用的递归。 _.mergeWith()接受自定义程序功能。如果自定义程序返回undefined,则_.mergeWith()会使用默认的合并规则。

const original = {"totAmount":10,"testVal":"zzzzzzzz","potentialPaid":10,"depositAmount":10,"payment":{"amount":10,"testVal":"zzzzzzzz","details":{"amount":10,"testVal":"zzzzzzzz","statusHistory":{"amount":10,"testVal":"zzzzzzzz"}}},"coupon":{"test":1000}};
const dataToUpdate = {"totAmount":65,"potentialPaid":65,"depositAmount":65,"payment":{"amount":65,"details":{"amount":65,"statusHistory":{"amount":65}}},"coupon":{}};

const result = _.mergeWith(original, dataToUpdate, (objValue, srcValue) => _.isEmpty(srcValue) ? srcValue : undefined);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

答案 2 :(得分:0)

我做了一个自定义函数来替换对象中的嵌套属性,包括数组和对象


const a = {
  name: 'John Doe',
  email: 'john@mail.com',
  location: {
    country: {
      name: 'Japan',
      abbr: 'JP',
    },
    place: 'Tokyo',
  },
  phone: [123, 456],
};

const b = {
  email: 'johndoe@mail.com',
  location: {
    country: {
      name: 'Canada',
      abbr: 'CA',
    },
  },
  phone: [123],
};

const superReplace = (object, value) => {
  let replace = {};

  Object.keys(object).forEach((prop) => {
    if (value[prop] !== undefined) {
      if (Array.isArray(object[prop])) replace[prop] = value[prop];
      else if (typeof object[prop] === 'object') {
        replace[prop] = superReplace(object[prop], value[prop]);
      } else replace[prop] = value[prop];
    } else replace[prop] = object[prop];
  });

  return replace;
};
console.log(superReplace(a, b));
// {
//   name: 'John Doe',
//   email: 'johndoe@mail.com',
//   location: { country: { name: 'Canada', abbr: 'CA' }, place: 'Tokyo' },
//   phone: [ 123 ]
// }