Lodash合并带有嵌套数组的对象无法正常工作

问题描述

当尝试与内部带有平面数组的lodash对象合并时,发现意外结果。 这里是示例:

var people = { name: 'Andrew',age: '30',values: ["PT","PORTA 31"] };

const person = { age: '31',values: ["PT"] };

var people2 = { name: 'Andrew',values: [{ pippo : 1}] };

const person2 = { age: '31',values: [{ pippo : 2}] };

// Now merge person back into people array
console.log(_.merge({},people,person));

console.log(_.merge({},people2,person2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>

一个console.log的结果是

{
  age: "31",name: "Andrew","PORTA 31"]
}

与预期不符

{
  age: "31",values: ["PT"]
}

有人可以向我解释原因,并给我一个解决方案,以确保使用平面数组可以为我提供正确的值

解决方法

我相信_.assign(people,person)在这种情况下会产生预期的结果https://lodash.com/docs/4.17.15#assign

此功能也是本机功能,可以像Object.assign(target,source)这样使用

,

我认为在这种情况下,赋值比合并更好

while True:
    try:
        n1 = int(input( 'Please enter the number 1  positive integer number (1-39):'))
        print('Continue....')
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue
    try:
        n2 = int(input('Please enter the number 2 positive integer number(1-39):'))
        print('Continue....')
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue
    try:
        n3 = int(input('Please enter the number 3  positive integer number (1-39):'))
        print('Continue...')
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue
    try:
        n4 = int(input('Please enter the number 4 positive integer number(1-39):'))
        print('Continue...')
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue
    try:
        n5 = int(input('Please enter the number 5 positive integer number(1-39):'))
        print('Continue...')
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue
    try:
        n6 = int(input('Please enter the number 6 positive integer number(1-39):'))
        print('Continue....')
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue
    try:
        n7 = int(input('Please enter the number 7 positive integer number(1-39):'))
        print('Continue....')
        break
    except ValueError:
        print('What you entered is not positive integer number(1-39)! Please enter a positive integer number(1-39):')
        continue

This method is like _.assign except that it recursively merges own and inherited enumerable string keyed properties of source objects into the destination object. Source properties that resolve to undefined are skipped if a destination value exists. Array and plain object properties are merged recursively. Other objects and value types are overridden by assignment. Source objects are applied from left to right. Subsequent sources overwrite property assignments of previous sources.
var people = { name: 'Andrew',age: '30',values: ["PT","PORTA 31"] };

const person = { age: '31',values: ["PT"] };

console.log(_.assign({},people,person));