简体   繁体   English

从JavaScript中的一维数组返回二维数组

[英]Return Two-Dimensional Array from Single Dimensional Array in JavaScript

I have a single dimension array of a series of numbers: 我有一系列数字的一维数组:

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

I'm trying to insert the sum of the digits of each number alongside it to create a two-dimensional array, so that the output is: 我正在尝试在每个数字旁边插入每个数字的总和以创建一个二维数组,以便输出为:

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

Unfortunately, my code: 不幸的是,我的代码:

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);

}

results in the following output instead: 而是产生以下输出:

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

That is, I'm ending up with four separate two-dimensional arrays rather than one two-dimensional array with four items. 也就是说,我最后得到四个单独的二维数组,而不是一个包含四个项目的二维数组。

Will someone please show me the error of my (newbie) JavaScript ways? 有人可以告诉我我(新手)JavaScript方式的错误吗?

You need to push xWithSum onto a result array. 您需要将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); 

You could also use .map() to run a function on each element of an array and return an array of the results. 您还可以使用.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); 

You could just iterate over the elements and over the characters for summing. 您可以遍历元素和字符进行求和。

 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); 

One more "you could just": 还有一个“你可以”:

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

Instead of 代替

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

do something like 做类似的事情

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

Also your way of counting the sum will not work, as you are trying to load a 16 digit integer into a javascript number. 另外,您尝试计算总和的方式将不起作用,因为您尝试将16位整数加载到javascript数字中。 That will not work, javascript numbers doesn't have that much precision. 那是行不通的,javascript数字没有那么精确。 You can calculate the sum instead this way: 您可以这样计算总和:

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

Couldn't you just... create an array above it and push the result to that array? 您不能只是...在其上方创建一个数组并将结果推送到该数组吗?

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']);
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

You can use Array.prototype.reduce to reduce your array of strings into the required format as below: 您可以使用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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM