【问题标题】:Overwrite array of objects by another without affecting first's order用另一个对象覆盖数组而不影响一阶
【发布时间】:2018-03-02 09:58:58
【问题描述】:

我有两个对象数组如下:

var listA = [
    { name: 'monday', reported: '', closed: '' },
    { name: 'tuesday', reported: '', closed: '' },
    { name: 'wednesday', reported: '', closed: '' },
    { name: 'thursday', reported: '', closed: '' },
    { name: 'friday', reported: '', closed: '' },
    { name: 'saturday', reported: '', closed: '' },
    { name: 'sunday', reported: '', closed: '' }
];

var listB = [
    { name: 'friday', reported: '23', closed: '17' },
    { name: 'tuesday', reported: '28', closed: '24' },
    { name: 'saturday', reported: '10', closed: '8' },
];

我想用 listB 中的值覆盖 listA,而不影响 listA 中对象的顺序。我用 _.unionByJSFiddle 试过了。结果如下:

{name: "friday", reported: "23", closed: "17"}
{name: "tuesday", reported: "28", closed: "24"}
{name: "saturday", reported: "10", closed: "8"}
{name: "monday", reported: "", closed: ""}
{name: "wednesday", reported: "", closed: ""}
{name: "thursday", reported: "", closed: ""}
{name: "sunday", reported: "", closed: ""}

我期待以下结果:

{name: "monday", reported: "", closed: ""}
{name: "tuesday", reported: "28", closed: "24"}
{name: "wednesday", reported: "", closed: ""}
{name: "thursday", reported: "", closed: ""}
{name: "friday", reported: "23", closed: "17"}
{name: "saturday", reported: "10", closed: "8"}
{name: "sunday", reported: "", closed: ""}

我知道如何通过迭代 listA 并用相同的 name 替换来自 listB 的值来做到这一点。但是想知道 lodash 或 ES6 是否有更好的方法来做到这一点。

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    使用map(这样数组就不必突变)和find

    var listC = listA.map( s => 
         Object.assign( {}, s, 
          listB.find( s1 => s1.name == s.name ) ) );
    

    演示

    var listA = [
        { name: 'monday', reported: '', closed: '' },
        { name: 'tuesday', reported: '', closed: '' },
        { name: 'wednesday', reported: '', closed: '' },
        { name: 'thursday', reported: '', closed: '' },
        { name: 'friday', reported: '', closed: '' },
        { name: 'saturday', reported: '', closed: '' },
        { name: 'sunday', reported: '', closed: '' }
    ];
    
    var listB = [
        { name: 'friday', reported: '23', closed: '17' },
        { name: 'tuesday', reported: '28', closed: '24' },
        { name: 'saturday', reported: '10', closed: '8' },
    ];
    
    var listC = listA.map( s => 
         Object.assign( {}, s, 
          listB.find( s1 => s1.name == s.name ) ) );
    
    console.log( listC );

    【讨论】:

    • 我想知道是否有任何理由写Object.assign( {}, s, listB.find( s1 => s1.name == s.name ) )而不是Object.assign( s, listB.find( s1 => s1.name == s.name ) )
    • @Arkej 可能是因为那会修改 listA 数组
    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多