【问题标题】:React how to replace name if Id matches如果 Id 匹配,反应如何替换名称
【发布时间】:2021-09-10 18:48:10
【问题描述】:

我有两个对象数组 result1 和 result2

var result1 = [
    {id:1, name:'Sandra'},
    {id:2, name:'John'},
    {id:3, name:'Peter'},
    {id:4, name:'Bobby'}
];

var result2 = [
    {id:2, name:'Malai'},
    {id:4, name:'Lama'}
];

如果 id 匹配,我想更新名称。我的目标是:

 var result1 = [
        {id:1, name:'Sandra'},
        {id:2, name:'Malai'},
        {id:3, name:'Peter'},
        {id:4, name:'Lama'}
    ];

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

var result1 = [{
        id: 1,
        name: 'Sandra'
    },
    {
        id: 2,
        name: 'John'
    },
    {
        id: 3,
        name: 'Peter'
    },
    {
        id: 4,
        name: 'Bobby'
    }
];

var result2 = [{
        id: 2,
        name: 'Malai'
    },
    {
        id: 4,
        name: 'Lama'
    }
];

let results = result1.map(x => {
    let el = result2.find(y => y.id === x.id);
    if (el) return {
        ...x,
        name: el.name
    };
    return x;

});

console.log(results)

【讨论】:

  • 不错的答案。 find、early return pattern 和 spread operator 的使用使它非常干净。
【解决方案2】:

var result1 = [
    {id:1, name:'Sandra'},
    {id:2, name:'John'},
    {id:3, name:'Peter'},
    {id:4, name:'Bobby'}
];

var result2 = [
    {id:2, name:'Malai'},
    {id:4, name:'Lama'}
];

const finalResult = result1.map((user, index) => {
 const match = result2.find(({ id }) => user.id === id)
 
 return match ? { ...user, name: match.name } : user
})

console.log(finalResult)

您可以使用map来映射result1并使用find来匹配map中的当前项目以查看result2是否包含与该id匹配的对象,如果是则返回包含当前用户的新对象但使用匹配名称,如果不只是返回用户

【讨论】:

    【解决方案3】:

    试试下面的截图。代码非常简单。我们遍历第一个结果数组的每个对象(人)。对于每个人,我们将迭代 result2。如果找到相同的 id,则该人的对象将被覆盖。代码的输出是带有您提出的目标的第三个数组。

    var result1 = [
        {id:1, name:'Sandra'},
        {id:2, name:'John'},
        {id:3, name:'Peter'},
        {id:4, name:'Bobby'}
    ];
    
    var result2 = [
        {id:2, name:'Malai'},
        {id:4, name:'Lama'}
    ];
    
    const finalResult = result1.map(person => {
      for (let i = 0; i < result2.length; i++) {
        if(person.id === result2[i].id){
          person = result2[i];
          break;
        }
      }
      return person;
    });
    
    console.log(finalResult);

    【讨论】:

      【解决方案4】:

      我认为有办法一次性解决这个问题。

      根据您给出的示例,我将假设:

      1. 两个数组都按 w.r.t 排序。身份证
      2. 给定数组中的元素具有唯一 ID

      这个想法是使用两个指针来识别数组重叠的区域。它的灵感来自于合并排序中的合并子例程。

      var i = 0 
      var j = 0
      
      while(i < result1.length && j < result2.length) {
        var left = result1[i]
        var right = result2[j]
        if(left.id > right.id) {
          j++ 
        } else if(left.id < right.id) {
          i++
        } else {
          left.name = right.name
          i++
          j++
        }
      }
      

      【讨论】:

        【解决方案5】:

        简短的语法:

        result1 = result1.map(el => ({...el, name: result2.find(item => el.id === item.id)?.name ?? el.name}))
        

        【讨论】:

          猜你喜欢
          • 2019-07-18
          • 1970-01-01
          • 2014-02-07
          • 2011-05-26
          • 2022-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多