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

Posted

技术标签:

【中文标题】从 JavaScript 中的一维数组返回二维数组【英文标题】:Return Two-Dimensional Array from Single Dimensional Array in JavaScript 【发布时间】:2016-05-19 20:19:58 【问题描述】:

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

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 方式的错误吗?

【问题讨论】:

第一个数字的总和不应该是102吗? 只需将结果推送到新数组中。 【参考方案1】:

您需要将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);

【讨论】:

【参考方案2】:

您可以只遍历元素和字符以进行求和。

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

【讨论】:

【参考方案4】:

而不是

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:
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

【讨论】:

【参考方案7】:

您可以使用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);

【讨论】:

以上是关于从 JavaScript 中的一维数组返回二维数组的主要内容,如果未能解决你的问题,请参考以下文章

javascript 定义二维数组,两列,未知行数

将二维 JavaScript 数组转换为一维数组 [重复]

JavaScript之数组

javascript与php一维数组与二维数组互转

PHP中怎么从一个二维数组中随机取出一个值?

JavaScript 二维数组转一维数组