目录

1.比较两个数组是否相同

Javascript不能直接用==或者===来判断两个数组是否相等,因此需要将数组转换成字符串再做比较,但是数组内各元素的顺序不一定一致,所以只要排序后再转换即可。

demo.js
1
[1,2,3].sort().toString()== [3,2,1].sort().toString() //true

2.多维数组排列组合,两两组合成新数组

项目中有遇到一个需求:现在有一批手机,其中颜色有[’白色’,‘黑色’,‘金色’,‘粉红色’];内存大小有[’16G’,‘32G’,‘64G’,‘128G’],版本有[’移动’,‘联通’,‘电信’],要求写一个算法,实现[’白色,16G,移动’, ‘白色,16G,联通’ …]这样的组合,允许后期再新增属性数组,例如再加一个[’国行’,‘港版’,‘美版’]。

demo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function permutations(arr) {
      var len = arr.length;
      // 当数组大于等于2个的时候
      if (len >= 2) {
        // 第一个数组的长度
        var len1 = arr[0].length;
        // 第二个数组的长度
        var len2 = arr[1].length;
        // 2个数组产生的组合数
        var lenBoth = len1 * len2;
        //  申明一个新数组,做数据暂存
        var items = new Array(lenBoth);
        // 申明新数组的索引
        var index = 0;
        // 2层嵌套循环,将组合放到新数组中
        for (var i = 0; i < len1; i++) {
          for (var j = 0; j < len2; j++) {
            items[index] = arr[0][i] + "," + arr[1][j];
            index++;
          }
        }
        // 将新组合的数组并到原数组中
        var newArr = new Array(len - 1);
        for (var i = 2; i < arr.length; i++) {
          newArr[i - 1] = arr[i];
        }
        newArr[0] = items;
        // 执行回调
        return permutations(newArr);
      } else {
        return arr[0];
      }
    }

    var arr = [['a', 'b', 'c','d'], [1, 2, 3,4], ['x', 'y', 'z'],['魅族手机']];
    console.log(permutations(arr));
    // ["a,1,x,魅族手机", "a,1,y,魅族手机", "a,1,z,魅族手机", "a,2,x,魅族手机", "a,2,y,魅族手机", "a,2,z,魅族手机", "a,3,x,魅族手机", "a,3,y,魅族手机", "a,3,z,魅族手机", "a,4,x,魅族手机", "a,4,y,魅族手机", "a,4,z,魅族手机", "b,1,x,魅族手机", "b,1,y,魅族手机", "b,1,z,魅族手机", "b,2,x,魅族手机", "b,2,y,魅族手机", "b,2,z,魅族手机", "b,3,x,魅族手机", "b,3,y,魅族手机", "b,3,z,魅族手机", "b,4,x,魅族手机", "b,4,y,魅族手机", "b,4,z,魅族手机", "c,1,x,魅族手机", "c,1,y,魅族手机", "c,1,z,魅族手机", "c,2,x,魅族手机", "c,2,y,魅族手机", "c,2,z,魅族手机", "c,3,x,魅族手机", "c,3,y,魅族手机", "c,3,z,魅族手机", "c,4,x,魅族手机", "c,4,y,魅族手机", "c,4,z,魅族手机", "d,1,x,魅族手机", "d,1,y,魅族手机", "d,1,z,魅族手机", "d,2,x,魅族手机", "d,2,y,魅族手机", "d,2,z,魅族手机", "d,3,x,魅族手机", "d,3,y,魅族手机", "d,3,z,魅族手机", "d,4,x,魅族手机", "d,4,y,魅族手机", "d,4,z,魅族手机"]

此外,我还搜索到其他几种方法:

demo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function doExchange(arr, depth){
    for (var i = 0; i < arr[depth].length; i++) {
        result[depth] = arr[depth][i]
        if (depth != arr.length - 1) {
            doExchange(arr, depth + 1)
        } else {
            results.push(result.join(','))
        }
    }
}

function test(arr){
    results = [];
    result = [];
    doExchange(arr, 0);
}

var garr = [
        ['a', 'b', 'c'],
        ['1', '2', '3'],
        ['x', 'y', 'z'],
    ];
test(garr);

console.log(results);
//["a,1,x", "a,1,y", "a,1,z", "a,2,x", "a,2,y", "a,2,z", "a,3,x", "a,3,y", "a,3,z", "b,1,x", "b,1,y", "b,1,z", "b,2,x", "b,2,y", "b,2,z", "b,3,x", "b,3,y", "b,3,z", "c,1,x", "c,1,y", "c,1,z", "c,2,x", "c,2,y", "c,2,z", "c,3,x", "c,3,y", "c,3,z"]
demo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function doExchange(arr){
        var len = arr.length;
        // 当数组大于等于2个的时候
        if(len >= 2){
            // 第一个数组的长度
            var len1 = arr[0].length;
            // 第二个数组的长度
            var len2 = arr[1].length;
            // 2个数组产生的组合数
            var lenBoth = len1 * len2;
            //  申明一个新数组,做数据暂存
            var items = new Array(lenBoth);
            // 申明新数组的索引
            var index = 0;
            // 2层嵌套循环,将组合放到新数组中
            for(var i=0; i<len1; i++){
                for(var j=0; j<len2; j++){
                    items[index] = arr[0][i] +","+ arr[1][j];
                    index++;
                }
            }
            // 将新组合的数组并到原数组中
            var newArr = new Array(len -1);
            for(var i=2;i<arr.length;i++){
                newArr[i-1] = arr[i];
            }
            newArr[0] = items;
            // 执行回调
            return doExchange(newArr);
        }else{
            return arr[0];
        }
    }

    var array = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']];
    doExchange(array);
    //["a,1,x", "a,1,y", "a,1,z", "a,2,x", "a,2,y", "a,2,z", "a,3,x", "a,3,y", "a,3,z", "b,1,x", "b,1,y", "b,1,z", "b,2,x", "b,2,y", "b,2,z", "b,3,x", "b,3,y", "b,3,z", "c,1,x", "c,1,y", "c,1,z", "c,2,x", "c,2,y", "c,2,z", "c,3,x", "c,3,y", "c,3,z"]