重构嵌套在...语句中

时间:2019-02-22 00:51:27

标签: javascript arrays

我有一个具有以下结构的数组:

var array = [
  [
    [3, 5], //a
    [8, 2], //b
    [5, 3], //c
    [8, 1]  //d
  ],
  [
    [3, 9], //a
    [7, 4], //b
    [5, 6], //c
    [8, 8]  //d
  ]
]

我想使用数组中的所有数据获得4个部分(a,b,c,d)的第二个数字之和的所有可能组合(很难表达,对不起)。

示例: 取数组a,b,c和d的第二个数字并将它们相加(5 + 2 + 3 +1 = 11)。之后,我们从第二个数组([x,2]-> [x,4])中获取第二个数字'b'并再次求和(5 + 4 + 3 +1 = 13),然后't change'b',取'c'第二数组的第二个数字和总和,等等。

如果要更改第二个数字“ a”,则必须从第二个数组中获取“ a”个第二个数字-我们不能使用第二个数组的“ b”个第二个数字代替“ a”。 1st a-> 2nd a,1st b-> 2nd b,1st c-> 2nd c,1st d-> 2nd d。

[3, 5],             [3, 5],
[8, 2], -> [n, 4] = [8, 4],
[5, 3],             [5, 3],
[8, 1]              [8, 1]
    11                  13
___________________________

[3, 5],             [3, 5],
[8, 4],             [7, 4],
[5, 3], -> [n, 6] = [5, 6],
[8, 1]              [8, 1]
    13                  16

所以有16种可能的组合。

我使用4个'for ... in'语句制作了代码,并且效果很好,但是我认为有一种更好的方法来解决此任务(使用更少的代码或重构嵌套的语句)-但我没有知道哪一个。

我的解决方案:

var array = [
  [
    [3, 5], //a
    [8, 2], //b
    [5, 3], //c
    [8, 1]  //d
  ],
  [
    [3, 9], //a
    [7, 4], //b
    [5, 6], //c
    [8, 8]  //d
  ]
]

var sum = 0,
    id = 1;

for (var a in array) {
  for (var b in array) {
    for (var c in array) {
      for (var d in array) {
        sum = array[a][0][1] +
            array[b][1][1] +
            array[c][2][1] +
            array[d][3][1];

        console.log('ID: ' + id++ + " Sum = " + sum);
      }
    }
  }
}

输出:

ID: 1 Sum = 11
ID: 2 Sum = 18
ID: 3 Sum = 14
ID: 4 Sum = 21
ID: 5 Sum = 13
ID: 6 Sum = 20
ID: 7 Sum = 16
ID: 8 Sum = 23
ID: 9 Sum = 15
ID: 10 Sum = 22
ID: 11 Sum = 18
ID: 12 Sum = 25
ID: 13 Sum = 17
ID: 14 Sum = 24
ID: 15 Sum = 20
ID: 16 Sum = 27

我想知道有解决此任务的最佳方法吗?我可以将4个“ for ... in”语句更改为更好的语句吗?您将如何解决此任务?

我只是想更改

for (var a in array) {
  for (var b in array) {
    for (var c in array) {
      for (var d in array) {
        /* ... */
      }
    }
  }
}

更好的东西。

P.S。同样,“ for ... in”语句的数量取决于最后一个数组中“ parts”的数量。

a, b, c, d = 4 parts
4 parts = 4 'for...in' statements

2 个答案:

答案 0 :(得分:0)

您可以使用{Name:'John Smith'}, {Name:'Jane Doe', Email:'coolkid69@email.com'}, {Name:'Bob Alan'}

在一行中实现相同的功能

map

答案 1 :(得分:0)

一个讨厌的解决方案:我们总是知道对于2个大小为n的数组,将有2 ^ n个组合。同样,数字可以二进制格式表示,例如5代表0101。二进制格式的每个数字实际上都可以代表您应该从哪个数组中获取值,例如0将来自数组1,而1将来自数组2。

实施:

var array = [
  [
    [3, 5], //a
    [8, 2], //b
    [5, 3], //c
    [8, 1], //d
  ],
  [
    [3, 9], //a
    [7, 4], //b
    [5, 6], //c
    [8, 8], //d
  ],
];

var sum = 0;
var length = array[0].length;
var noOfCombination = 2**length;
for (var i=0; i<noOfCombination; i++) {
  var binary = (i >>> 0).toString(2).padStart(length, '0');
  for (var j=0; j<binary.length; j++) {
    if (binary[j] === '0') {
      sum += array[0][j][1];
    } else {
      sum += array[1][j][1]
    }
  }
  console.log('ID: ' + (i + 1) + " Sum = " + sum);
  sum = 0;
}