新手多维数组加法困境
Newbie Multidimensional Array Addition Dilemma
我正在尝试添加嵌入其他 3 个不同长度数组的数组的所有元素。第三级是两个 1 元素数组,我不知道如何访问它们的值。我做错了什么?请告知(请不要扔灯)。
function addArrayElems(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number") sum += arr[i];
for (var j = 0; j < arr.length; j++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
}
//arr[i][j][k] doesn't work
for (var k = 0; k < arr.length; k++) {
if (typeof arr[i][j][k] === "number") sum += arr[i][j][k];
}
for (var l = 0; l < arr.length; l++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
让我们使用 reduce
!
function addArrayElems(arr) {
return arr.reduce(function(memo, item){
if (typeof item !== "number") {
return memo + addArrayElems(item);
}
return memo + item;
}, 0);
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
这应该在你遍历时检查一个数组,然后递归地总结它们。 请注意,此示例代码需要整数。
function getSumOfArray(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
//Check for array
if( Object.prototype.toString.call( arr[i] ) === '[object Array]' ) {
sum += getSumOfArray(arr[i]);
} else {
sum += parseInt(arr[i], 10);
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
alert(getSumOfArray(arr));
对已发布问题的解释
function addArrayElems(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number") sum += arr[i];
for (var j = 0; j < arr.length; j++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
//added this line here. If arr[i][j] is defined and [i][j][0] return sum.
if (arr[i][j] && typeof arr[i][j][0] === "number") sum += arr[i][j][0];
}
for (var l = 0; l < arr.length; l++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
在您自己的代码中,您迭代了父数组arr
。当您访问arr[i]
这将始终有效。如果设置,JavaScript 将返回一个值,否则返回undefined
。但是,当您尝试访问非属性(undefined
)上的属性时,这将返回脚本错误。你不能要求不存在的物体的颜色。上面的代码应该根据你提供的示例返回所需的结果(因为第三级数组的长度只有 1)。上面的例子只是为了解释访问多维数组中的值是如何工作的。但是,您希望以递归方式执行此操作。我将在下面向您展示一个例子:
改进的答案 (http://jsfiddle.net/o80e7f53/)
function addArrayElems(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number")
{
sum += parseInt(arr[i]); //parse number and add to sum.
}
else if (Object.prototype.toString.call(arr[i]) === '[object Array]')
{
sum += addArrayElems(arr[i]);
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
递归函数再次调用自身。本质上,如果您的多维数组深度为 100 个数组,则此函数仍将返回所有值。在你的方法中,这应该需要 100 个循环,你需要单手编写。此函数循环遍历数组的值,并在找到数字时返回总和。如果找到数组对象,则函数将再次调用自身,但当前数组对象除外。返回的结果将存储到总和中。当函数最终返回到第一个函数调用时; sum
包含每个数组级别的所有值。
这是递归的主要候选者:
<script type="text/javascript">
$(function () {
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
var sum = sumArray(arr);
alert(sum);
});
function sumArray(value) {
var sum = 0;
if (value == null) {
return 0;
}
//Base Case
if (typeof value == "number") {
return value;
}
else
//It must be an array
{
value.forEach(function (arrayItem) {
sum += sumArray(arrayItem);
});
}
return sum;
}
</script>
编辑
要求在没有 JQuery 的情况下解决这个问题。函数仍然相同:
<script type="text/javascript">
function onClick() {
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
var sum = sumArray(arr);
alert(sum);
};
function sumArray(value) {
var sum = 0;
if (value == null) {
return 0;
}
//Base Case
if (typeof value == "number") {
return value;
}
else
//It must be an array
{
value.forEach(function (arrayItem) {
sum += sumArray(arrayItem);
});
}
return sum;
}
</script>
这个函数可以随心所欲地调用,例如,我使用了没有JQuery的HTML输入。
<input type="button" onClick="onClick()" value="Click ME"/>
解决问题的另一种方法:
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
此函数将所有给定的数组合并在一起并展平合并后的数组。
function merge_array(){
var newArray = [];
var allArray = Array.prototype.concat.apply([],arguments);
for(var e=0; e <allArray.length; e++){
var ele = allArray[e];
if(ele.__proto__.constructor === Array){
newArray = newArray.concat(merge_array(ele));
}
else{
newArray.push(ele);
}
}
return newArray;
}
最后将所有数字元素相加:
var singleArray = merge_array(arr);
var sum = 0;
for(var i=0; i<singleArray.length; i++){
sum+=singleArray[i];
}
console.log('sum: ',sum);
希望这有帮助。
截至 2019 年,使用 reduce 的答案已被弃用(或者至少有更好的解决方案来解决它)。使用 Array.flat() 方法来"展平"数组并获取它的长度:
var matrix = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
// this will return you 10
console.log("Length of multidimensional array items: " matrix.flat().length)
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- javascript中的数组出错
- 如何使用 node.js 比较两个 json 数组
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- 如何通过数组更新角度子范围
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 在Javascript中转换对象数组
- 新手多维数组加法困境