【问题标题】:Compare two Arrays and replace Duplicates with values from a third array比较两个数组并用第三个数组中的值替换重复项
【发布时间】:2017-05-12 23:52:50
【问题描述】:
var array1 = ['a','b','c','d'];
var array2 = ['a','v','n','d','i','f'];

var array3 = ['1','2','3','4','5','6'];

刚开始学习 Javascript,我不知道如何将 array2 的值与 array1 上的值进行比较,如果是这样,请将其替换为来自 array3 的对应数组索引。

把它变成这样:

array2 = ['1','v','n','4','i','f'];

而且,即使索引位置不同,它也必须比较 array1 和 array2 的值​​,如下所示:

var array1 = ['a','b','c','d'];
var array2 = ['d','v','n','a','i','f'];

感谢您的帮助

【问题讨论】:

  • 您要更改array2吗?
  • 是的。而且,即使索引位置不同,它也必须比较 array1 和 array2 的值​​,如下所示: var array1 = ['a','b','c','d']; var array2 = ['d','v','n','a','i','f'];对不起,如果我不是很清楚...
  • 请在问题中添加信息,因为它很重要。
  • 你是对的,对不起

标签: javascript arrays


【解决方案1】:

您可以使用哈希表并进行检查。如果字符串不包含在哈希表中,则为该元素设置替换值。

var array1 = ['a','b','c','d'],
    array2 = ['d','v','n','a','i','f'],
    array3 = ['1','2','3','4','5','6'],
    hash = Object.create(null);

array1.forEach(function (a) {
    hash[a] = true;
});

array2.forEach(function (a, i, aa) {
    if (hash[a]) {
        aa[i] = array3[i];
    }
});

console.log(array2);

ES6 与 Set

var array1 = ['a','b','c','d'],
    array2 = ['d','v','n','a','i','f'],
    array3 = ['1','2','3','4','5','6'];

array2.forEach((hash => (a, i, aa) => {
    if (hash.has(a)) {
        aa[i] = array3[i];
    }
})(new Set(array1)));

console.log(array2);

【讨论】:

  • 但是如果array1 比array2 长怎么办
  • 问题是转成这样:array2 = ['1','v','n','4','i','f'];
【解决方案2】:

形式有很多种,这是一种基本形式:

var array1 = ['a','b','c','d'];
var array2 = ['a','v','n','d','i','f'];
var array3 = ['1','2','3','4','5','6'];
var result = [];//define array of result
for(var i=0;i<array2.length;i++){//Iterate the array2
    if(array2[i] == array1[i])//Compare if array1 in index 'i' with array2 in index 'i'
        result[i] = array3[i];//if true put in result in index 'i' from array3
    else
        result[i] = array2[i];//else put in result in index 'i' from array2
}
console.log(result);//show in console the result

【讨论】:

    【解决方案3】:
    function replaceDuplicates(array1, array2, array3) {
    
        // array3 can't be smaller than array1!
        if (array3.length < array1.length) throw new Error('array3 < array1');
    
        // Loop through all the items in array1...
        for (var i = 0; i < array1.length; i++) {
    
            // Check if the item in array2 matches...
            if (i < array2.length && array2[i] === array1[i]) {
    
                // And if it does replace array1's item with array3's item!
                array1[i] = array3[i];
    
            }
        }
    }
    
    
    var array1 = ['a','b','c','d'];
    var array2 = ['a','v','n','d','i','f'];
    var array3 = ['1','2','3','4','5','6'];
    
    replaceDuplicates(array1, array2, array3);
    
    console.log(array1); // ['1','v','n','4','i','f']
    

    【讨论】:

      【解决方案4】:

      这里有一些代码可以满足你的要求:

          var array1 = ['a','b','c','d'];
          var array2 = ['a','v','n','d','i','f'];
          var array3 = ['1','2','3','4','5','6'];
          var biggerArrayLength = 0;
      
              if(array1.length > array2.length){
                  biggerArrayLength = array1.length;
              }else{
                  biggerArrayLength = array2.length;
              }
      
              for(var i = 0; i < biggerArrayLength; i++){
                  if(array1[i] == array2[i]){
                      array2[i] = array3[i];
                  }
              }
      

      希望对你有帮助!

      【讨论】:

        【解决方案5】:

        使用Array#map

        array2.map((v, i) => v === array1[i] ? array3[i] : v);
        

        【讨论】:

          【解决方案6】:

          您可以在array2 上使用map() 并查看当前元素是否与array1 中具有相同索引的元素相同,如果它是来自array3 且索引为i 的返回元素,则返回当前元素或e

          var array1 = ['a', 'b', 'c', 'd'];
          var array2 = ['a', 'v', 'n', 'd', 'i', 'f'];
          
          var array3 = ['1', '2', '3', '4', '5', '6'];
          
          var result = array2.map(function(e, i) {
            return e == array1[i] ? array3[i] : e;
          })
          
          console.log(result)

          【讨论】:

            【解决方案7】:

            使用Array.prototype.reduce 检查重复项并创建一个新数组 - 参见下面的演示:

            var array1 = ['a','b','c','d'];
            var array2 = ['a','v','n','d','i','f'];
            
            var array3 = ['1','2','3','4','5','6'];
            
            var result = array2.reduce(function(p,c,i){
              if(array1.indexOf(c) !== -1) {
                 p.push(array3[i]);
              } else {
                 p.push(c);
              }
              return p;
            },[]);
            
            console.log(result);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-08-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-21
              • 2014-12-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多