【问题标题】:How to get subset of two arrays into a different array using javascript?如何使用javascript将两个数组的子集放入不同的数组中?
【发布时间】:2015-05-25 07:12:31
【问题描述】:

我有 2 个数组。

 arr1=[1,8,1,3,2]

 arr2=[3,8,1]

我想将元素[8,1] 子集放入arr3。我如何使用 javascript 来做到这一点?我使用了以下代码。但似乎不起作用。

function subsetFind() {      
    var arr1 = [1,8,1,3,2]
    var arr2 = [3,8,1]
    var arr3 = [];
    var arr1length = arr1.length;
    var arra2length = arr2.length;

   for(var i = 0; i < arr1length; ++i){
        for(var j=0;j<arra2length;j++) {
            if(arr1[i] != arr2[j]) {
                break;
            } else {
                arr3.push(arr1[i]);
                break;
            }
        }
    }

    alert(arr3);
}

【问题讨论】:

  • 为什么是[8, 1]?另外,你的意思是它不起作用
  • 两个数组中都有 1,8 和 3
  • 在 arr1 中它有 8,1。在 arr2 中它也有 8,1 作为模式。我只想将这两个元素放入 arr3
  • 你想在 arr3 中获取通用值?
  • 这可能会有所帮助stackoverflow.com/questions/1885557/…

标签: javascript arrays subset


【解决方案1】:

试试这个解决方案 - 它检查当前和上一个或当前和下一个值是否相等:

function subsetFind() {
    var arr1 = [1,8,1,3,2]
    var arr2 = [3,8,1]
    var arr3 = [];
    var arr1length = arr1.length;
    var arra2length = arr2.length;
    var used_i = 0;
    for(var i = 0; i < arr1length; ++i){
        if(used_i != 0 && used_i < i-1){
            break;
        }
        for(var j=0;j<arra2length;j++) {
            if((arr1[i] == arr2[j] && arr1[i-1] == arr2[j-1]) || (arr1[i] == arr2[j] && arr1[i+1] == arr2[j+1])) {
               arr3.push(arr1[i]);
               used_i = i;
            }
        }
    }

    alert(arr3);
}

输出:

8,1

【讨论】:

  • 它给出了这两个数组的正确答案。但是想想下面的数组它不会给出答案。 arr1=[1,9,3,5,4,8,2,6,3,4] ,arr2=[5,2,4,8,2,6,4]。对于 arr3 它应该只给出 [4,8,2,6]。但它给出了 [4,8,2,6,4]。你能解决这个问题吗?
  • 好的,我编辑了答案 - 现在它检查 i 是否总是比之前的 i 大 1。
【解决方案2】:

我希望你想要; (更新:)

                function subset() {
                    var arr1 = [1, 9, 3, 5, 4, 8, 2, 6, 3, 4]
                    var arr2 = [5, 2, 4, 8, 2, 6, 4]
                    var arr3 = [];

                    var minSize=2; // minimum 2 element must in intersection
                    var findedMax = "";

                    var arr1Joined = ""; arr1.forEach(function (a) { arr1Joined += "," + a; });
                    
                    for(k=minSize;k<arr2.length;k++)
                        arr2.forEach(function (x,y) {
                            var fkey="";
                            for (i = y; i <= y+k; i++)
                                fkey += "," + arr2[i];
                            if (arr1Joined.indexOf(fkey) >= 0) findedMax = fkey;
                    });
                    arr3=findedMax.substr(1).split(",");
                    alert(arr3);
                }

【讨论】:

  • 没有。这不是我想要的。
  • 这就是我想要的。但是您能否改进答案以获得更多结果元素。例如,arr1 = [1, 9, 3, 5, 4, 8, 2, 6, 3, 4,3,7] ,arr2 = [5, 2, 4, 8, 2, 6, 4,1 ,3,7]。由于 3,7 在两个数组 arr3 中也应该包含 [4,8,2,6,3,7]。
【解决方案3】:

试试这个:

参考n-dru的回答:

function subset () {
        var arr1 = [1,9,3,5,4,8,2,6,3,4]
        var arr2 = [5,2,4,8,2,6,4]
        var arr3 = [];
        var arr1length = arr1.length;
        var arra2length = arr2.length;
        var finalResult;
       for(var i = 0; i < arr1length; ++i){
            for(var j=0;j<arra2length;j++) {
                if((arr1[i] == arr2[j] && arr1[i-1] == arr2[j-1]) || (arr1[i] == arr2[j] && arr1[i+1] == arr2[j+1])) {
                    arr3.push(arr1[i]);

                }
                else
                {
                    finalResult = arr3.toString();
                }
            }
        }

        alert(finalResult);
}

DEMO

【讨论】:

  • 这也不是我想要的。这给出了答案。但是如果我将第一个数组更改为 [1,9,3,5,4,8,2,6,3,4,4,8],那么它也应该给出 [4,8,2,6]。但它给出了 [4,8,2,6,4,8]。根据我的要求,数组 2 中没有表示 [4,8,2,6,4,8]。因此它只有 4,8,2,6。所以我只需要那个答案。
【解决方案4】:

我相信您的问题已经在:Simplest code for array intersection in javascriptFinding matches between multiple JavaScript Arrays 中得到了回答。您还可以在 lowdash 库中查看 _.intersection 的实现。

【讨论】:

    【解决方案5】:

    ES6 方式。

    [...new Set(arr1)].filter(v => arr2.includes(v))
    

    分解:

    new Set(arr1)                   // convert arr1 to Set to remove duplicates 
    
    [...new Set(arr1)]              // convert back to array
    
    arr2.includes(v)                // test if arr2 includes `v`
    
    [...new Set(arr1)].filter(v => arr2.includes(v))  // choose unique elements in both arrays
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2011-06-28
      • 2019-05-07
      • 2021-09-14
      相关资源
      最近更新 更多