关于两个数组比较问题,javascript

我想把两个数组相同的value值分离出来,最后push到一个数组里面,双重for循环遍历弄了挺久没搞出来,求解决

var arry = ["股票开户", "期贷开户", "基金定股", "我的股东户", "服务中心", "私人顾问", "股票分析", "华泰证券", "股票行情"]
var arry1 = ["股票开户", "期贷开户", "基金定股", "我的股东户", "服务中心", "股票分析", "股票行情"]

最终遍历出来的格式我希望是这样的,如果两个数组比较有相同的,最后一个disabled赋值为 false,不相同赋值为true

var arry3= [
  { label: '股票开户', value: '股票开户', disabled: false },
  { label: '期贷开户', value: '期贷开户', disabled: false },
   .....
  { label: '华泰证券', value: '华泰证券', disabled: true},
];
阅读 5k
6 个回答
var arry = ["股票开户", "期贷开户", "基金定股", "我的股东户", "服务中心", "私人顾问", "股票分析", "华泰证券", "股票行情"]
var arry1 = ["股票开户", "期贷开户", "基金定股", "我的股东户", "服务中心", "股票分析", "股票行情"]

var arr3 = [];

arry.forEach(function(e,i) {
    var pos = arry1.indexOf(e);

    if (pos > -1) {
        arr3.push({
            label:e,
            value:e,
            disabled:false
        })
        arry1.splice(pos,1);
    } else {
        arr3.push({
            label:e,
            value:e,
            disabled:true
        })
    }
})

arry1.length && arry1.forEach(function(e,i) {
    arr3.push({
        label: e,
        value: e,
        disabled: true
    })
})

console.log(arr3)
// 变成统计次数的集合{"股票开户": 2, "期贷开户": 2, ... , "华泰证券": 1}
var col = [...arry, ...arry1].reduce((p, c) => ((p[c] = ~~p[c] + 1),p), {});

var arr = Object.keys(col).map(v => ({label: v, value: v, disabled: col[v] === 1 ? true : false}));

// arr即你所求。

当然,为了防止在arry或者arry1本身就存在2个同样的情况导致结果错误,可以先去重。
只需要把[...arry, ...arry1]改为[...new Set(arry), ...new Set(arry1)]

var arry = ["股票开户", "期贷开户", "基金定股", "我的股东户", "服务中心", "私人顾问", "股票分析", "华泰证券", "股票行情"];
var arry1 = ["股票开户", "期贷开户", "基金定股", "我的股东户", "服务中心", "股票分析", "股票行情"];

//只取出它们公共部分(重叠部分)的话,下面这样就行了,干嘛搞的那么复杂!
arry1.filter((item,index)=>arry.indexOf(item) !== -1)

双重 for 太重了,提供一个简洁的思路,供参考

var set = new Set(arry)
var result = Array.from(new Set(arry1))
  .map(x => ({label: x, value: x, disabled: !set.delete(x)}))
  .concat(Array.from(set).map(x => ({label: x, value: x, disabled: true})))

为什么双重for循环太重,for循环不应该是最基础的,最底层的语法了吗?所有的这些不都是建立在它的基础上的吗?

var arry = ["股票开户", "期贷开户", "基金定股", "我的股东户", 
            "服务中心", "私人顾问", "股票分析", "华泰证券", "股票行情"]
var arry1 = ["股票开户", "期贷开户", "基金定股", "我的股东户", 
             "服务中心", "股票分析", "股票行情"]
var arry3 = [] //定义一个空的数组用于存放结果
var obj={} //定义一个临时的对象
for(var i=0;i<arry.length;i++)
{
  for(var j=0;j<arry1.length;j++)
  {
    if(arry[i]==arry1[j])//判断数组两个数组的值是否相等
    {
      obj.label=arry[i]
      obj.value=arry[i]
      obj.disabled=false
      arry1.splice(arry[i],1)//从数组arry1中删除已经遍历到的项
      break;//如果有相等的就跳出这次循环
    }else{
      obj.label=arry[i]
      obj.value=arry[i]
      obj.disabled=true
    }
  }
  arry3.push(obj)
  obj={}
}
for(var i=0;i<arry1.length;i++)
{
  obj.label=arry1[i]
  obj.value=arry1[i]
  obj.disabled=true
  arry3.push(obj)
  obj={}
}
console.log(arry3);

下班前跑来解答了一波疑问,有一个小bug就是传入的arr必须前一个比后一个长,但已经在代码中有了解决方案,希望能够与大家讨论获得更好的方案。
利用了数组的indexOf方法,
代码如下


    function compareArray(arr1,arr2) {

        // 传入数组长度限制arr1比arr2长
        if(arr2.length>arr1.length){
            //如果arr2更长,将arr1与arr2调换位置
            var tempArr = [];
            tempArr = arr1;
            arr1 = arr2;
            arr2 = tempArr;
        }

        var outputArr = [];
        for(var i= 0;i<arr1.length;i++){
            if(arr2.indexOf(arr1[i]) === -1){
                outputArr.push(arr1[i]);
            }
        }
        return outputArr;
    }

    var outArr = compareArray(arr2,arr1);

    // 遍历输出数组中元素
    for(var i=0;i<outArr.length;i++){
        console.log(outArr[i]);
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题