首页 文章

在JavaScript中从单维数组返回二维数组

提问于
浏览
0

我有一系列数字的单维数组:

var x = ['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904'];

我试图在它旁边插入每个数字的数字之和来创建一个二维数组,以便输出为:

[ [ '9493-4937-288383-8473', 96 ],
[ '4838-38403-8484', 65 ],
[ '9384-3848-4978-4944', 96 ],
[ '3920-2108-2845-1904', 58 ] ]

不幸的是,我的代码:

for (var i = 0; i < x.length; i ++) {
  var y = x[i].replace(/[- )(]/g,'');

  var sum = 0;
  var z = y;
  while (z > 0) {
    sum = sum + z % 10;
    z = Math.floor(z / 10);
  }

  var xWithSum = [x[i]]; 

  xWithSum.push(sum);

  console.log(xWithSum);

}

而是导致以下输出:

[ '9493-4937-288383-8473', 96 ]
[ '4838-38403-8484', 65 ]
[ '9384-3848-4978-4944', 96 ]
[ '3920-2108-2845-1904', 58 ]

也就是说,我最终得到了四个独立的二维数组,而不是一个带有四个项目的二维数组 .

有人请告诉我我的(新手)JavaScript方式的错误吗?

7 回答

  • 0

    您需要将 xWithSum 推送到结果数组 .

    var x = ['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904'];
    var result = [];
    for (var i = 0; i < x.length; i++) {
      var y = x[i].replace(/[- )(]/g, '');
    
      var sum = 0;
      var z = y;
      while (z > 0) {
        sum = sum + z % 10;
        z = Math.floor(z / 10);
      }
    
      var xWithSum = [x[i], sum];
      result.push(xWithSum);
    }
    
    console.log(result);
    

    您还可以使用 .map() 在数组的每个元素上运行函数并返回结果数组 .

    var x = ['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904'];
    var result = x.map(function(el) {
      var y = el.replace(/[- )(]/g, '');
    
      var sum = 0;
      var z = y;
      while (z > 0) {
        sum = sum + z % 10;
        z = Math.floor(z / 10);
      }
    
      var xWithSum = [el, sum];
      return xWithSum;
    });
    
    console.log(result);
    
  • 3

    你可以迭代元素和字符进行求和 .

    var x = ['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904'],
        y = x.map(function(a) {
            return [a, a.split('').reduce(function(a, b) {
                return a + (Number(b) || 0);
            }, 0)];
        });
    
    console.log(y);
    
  • 3

    还有一个“你可以”:

    x.map(function (num) {
      return [num, eval(num.replace(/\D*(\d)\D*/g, "$1+") + "0")];
    });
    
  • 1

    代替

    for (...) { 
        ...
        console.log(x);
    }
    

    做点什么

    var result = [];
    for (...) {
        ...
        result.push(x);
    }
    console.log(result);
    

    此外,您计算总和的方式也不起作用,因为您尝试将16位整数加载到javascript编号中 . 这不起作用,javascript数字没那么精确 . 您可以这样计算总和:

    var sum = 0;
    str.replace(/\d/g, x => sum+= +x);
    console.log(sum);
    
  • 0

    难道你不能......在它上面创建一个数组并将结果推送到该数组?

    function converArr (x) {
      resultArr = [];
    
      for (var i = 0; i < x.length; i ++) {
        var y = x[i].replace(/[- )(]/g,'');
    
        var sum = 0;
        var z = y;
        while (z > 0) {
          sum = sum + z % 10;
          z = Math.floor(z / 10);
        }
    
        var xWithSum = [x[i]]; 
    
        xWithSum.push(sum);
        resultArr.push(xWithSum);
      }
    
      return resultArr;
    }
    
    convertArr(['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904']);
    
  • 0
    var x = ['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904'];
    
    // Loop through everything
    for (var i = x.length - 1; i >= 0; i--) {
    
        // Replace each element with [element, digitsSum]
        x[i] = [x[i], getDigitsSum(x[i])];
    
    }
    
    // x now is as described
    
  • 0

    您可以使用 Array.prototype.reduce 将字符串数组缩减为所需格式,如下所示:

    var x = ['9493-4937-288383-8473', '4838-38403-8484', '9384-3848-4978-4944', '3920-2108-2845-1904'];
    
    var result = x.reduce(function(prev, current) {
        var curr = current.replace(/-/g, "");
        var sum = curr.split("").reduce(function (b, a) {
          return parseInt(a, 10) + b;
        }, 0);
    
        prev.push([current, sum]);  
        return prev;
    }, []);
    
    console.log(result);
    

相关问题