在不影响第一个订单的情况下,用另一个覆盖对象数组

问题描述 投票:0回答:1

我有两个对象数组如下:

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' },
];

我想用列表中的值覆盖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并用相同的listB替换name中的值来实现它。但是想知道是否有更好的方法通过lodash或ES6做到这一点。

javascript ecmascript-6 lodash
1个回答
2
投票

使用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 );
© www.soinside.com 2019 - 2024. All rights reserved.