【问题标题】:Find matching elements between two arrays and update them查找两个数组之间的匹配元素并更新它们
【发布时间】:2018-04-19 17:37:46
【问题描述】:

我认为有一个简单的解决方案,但我已经工作了这么久,我的大脑都在煎熬。

我有两个数组,例如:

[{name: "bob", age: 5},
 {name: "bob", age: 6}
 {name: "jim", age: 7}]

还有一个我想匹配的数组:

[{name: "bob", age: 5},
 {name: "bob", age: 6}]

我想遍历第一个数组并将所有带有name: bob 的条目更新为age + 1。所以得到的第一个数组将是:

[{name: "bob", age: 6},
 {name: "bob", age: 7}
 {name: "jim", age: 7}]

我尝试了一个 double for 循环遍历 array1 然后遍历 array2 但我遇到的问题是我将匹配 bob 两次,然后将年龄增加两次。

【问题讨论】:

  • 所以如果你找到名字,你就给他们的年龄加1?
  • @GerardoBLANCO 是的,不过我已经更新了我的问题。所以对于第二个数组,我会看到他们的名字两次。而且我不想将原始数组中的每个递增两次

标签: javascript arrays


【解决方案1】:

您可以使用Array.map 遍历array1 并返回modified 数组。

Array.map内部,使用Array.find方法查找current object是否存在于array2中。 如果找到对象,则更新age,否则返回原始数组。

var array1 = [{name: 'bob', age: 5},
 {name: 'bob', age: 6},
 {name: 'jim', age: 7}]


var array2 = [{name: 'bob', age: 5}, {name: 'bob', age: 6}]

var array3 = array1.map(arr => {
  if (array2.find(a => a.name === arr.name && a.age === arr.age)) {
    arr.age++;
  }
  return arr;
});

console.log(array3);

【讨论】:

    【解决方案2】:
     const persons = [{name: "bob", age: 5}, {name: "bob", age: 6}, {name: "jim", age: 7}];
    
     const personsThatGotOlderToday = [{name: "bob" } /*...*/];
    
     for(const person of persons) {
       if(personsThatGotOlderToday.some(p => p.name === person.name)) 
         person.age++;
     }
    

    然而,变老的人的数组实际上应该只包含人名......或者它应该直接引用人对象,从而不需要嵌套循环。

    【讨论】:

      【解决方案3】:

      您可以使用forEach 循环遍历数组,使用.find 在另一个数组中查找。如果是,则增加年龄,否则什么都没有

      var arr = [{name: "bob", age: 5},
       {name: "bob", age: 6},
       {name: "jim", age: 7}]
       
       var arr1 = [{name: "bob", age: 5},
       {name: "bob", age: 6}]
       
       arr.forEach(e=> arr1.find(a=> a.name === e.name) ? e.age++ :null)
       
       console.log(arr)

      【讨论】:

        【解决方案4】:
        for (var i = 0; i < arr1.length(); i++)
          for (var j = 0; i < arr2.length(); j++)
            if (JSON.stringify(arr1[i]) === JSON.stringify(arr2[j])) {
              arr1[i].age += 1 
        

        可能是一些小的语法错误,因为我很快就解决了这个问题

        【讨论】:

        • 我已经更新了我的问题,我的第二个数组缺少一个额外的元素
        • 更新了答案。我相信 === 会进行嵌套比较
        【解决方案5】:

        var array1 = [{"name": "bob", "age": 5},
         {"name": "bob", "age": 6},
         {"name": "jim", "age": 7}];
         
         var array2 = [{"name": "bob", "age": 5},{"name": "bob", "age": 6}]
        
         
        var array3 = array1.map(val =>{val.age =  array2.filter(obj => obj.name == val.name).length>0? val.age +1 : val.age; return val;});
        
        console.log(array3);

        【讨论】:

          【解决方案6】:

          这是适合我的 es5 格式:

              var arr = [{name: "bob", age: 5},{name: "bob", age: 6}, {name: "jim", age: 7}];
              for(var i = 0; i< arr.length; i++){
                  if(arr[i].name == "bob"){
                      arr[i].age+=1;
                  }
              }
              console.log(arr);

          【讨论】:

            猜你喜欢
            • 2018-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多