0

0

JavaScript教程:从二维数组(矩阵)行中高效计算正数之和

聖光之護

聖光之護

发布时间:2025-09-24 12:15:17

|

786人浏览过

|

来源于php中文网

原创

JavaScript教程:从二维数组(矩阵)行中高效计算正数之和

本教程将指导您如何在JavaScript中,从一个二维数组(矩阵)的每一行中,仅计算并累加所有正数,最终生成一个包含这些行总和的新数组。我们将详细分析常见的编码陷阱,例如求和变量的错误初始化和循环边界问题,并提供一个健壮且准确的解决方案。

理解需求:矩阵行正数求和

在数据处理和算法实现中,我们经常需要对二维数组(或称为矩阵)进行操作。一个常见的任务是遍历矩阵的每一行,并计算该行中所有正数的总和,最终将这些行总和存储到一个新的数组中。例如,给定一个3x3的矩阵:

[ [ 3, -1,  5],
  [-2,  4, -7],
  [ 1,  0,  6] ]

我们期望得到的结果数组将是 [ (3+5), (4), (1+6) ],即 [8, 4, 7]。

常见的编码陷阱与分析

在尝试实现上述功能时,开发者常会遇到一些问题,导致结果不准确。主要有两个陷阱:

陷阱一:求和变量的错误初始化

许多开发者可能会将行的第一个元素作为累加器的初始值,例如:

let posSum = myArray[i][0]; // 如果 myArray[i][0] 是负数,问题就出现了

这种做法的问题在于,如果行的第一个元素(myArray[i][0])是一个负数,那么 posSum 就会以一个负值开始累加。即使后续有正数加入,最终的总和也会被这个初始的负值所影响,导致结果偏低或错误。例如,如果一行是 [-5, 2, 3],posSum 会从 -5 开始,最终得到 (-5 + 2 + 3) = 0,而不是期望的 (2 + 3) = 5。

立即学习Java免费学习笔记(深入)”;

正确做法: 累加器(求和变量)应该始终初始化为 0,以确保从一个中立的基点开始计算。

陷阱二:循环范围的疏忽

另一个常见错误是内层循环的起始索引设置不当:

零沫AI工具导航
零沫AI工具导航

零沫AI工具导航-AI导航新标杆,探索全球实用AI工具

下载
for (let j = 1; j < myArray.length; j++) { // 注意:j 从 1 开始
    // ...
}

这里 j 从 1 开始,这意味着 myArray[i][0](即当前行的第一个元素)会被跳过,无论它是否为正数,都不会被纳入求和。这显然会导致结果不完整或不准确。

正确做法: 内层循环应该从索引 0 开始遍历当前行的所有元素,以确保每个元素都有机会被检查和累加。

正确的实现方法

结合对上述陷阱的分析,我们可以构建一个健壮的解决方案。核心思想是:

  1. 外层循环: 遍历矩阵的每一行。
  2. 内层循环前的初始化: 在进入内层循环(处理每一行)之前,将该行的累加器(例如 rowSum)初始化为 0。
  3. 内层循环: 遍历当前行的所有元素(从索引 0 开始到行末)。
  4. 条件判断: 在内层循环中,只对大于 0 的元素执行累加操作。
  5. 结果收集: 将每行的 rowSum 添加到最终的结果数组中。

以下是完整的JavaScript代码示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>矩阵行正数求和教程</title>
    <style>
        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; margin: 20px; background-color: #f4f4f4; color: #333; }
        pre { background-color: #eee; padding: 15px; border-radius: 5px; overflow-x: auto; }
        h3 { color: #0056b3; }
        #result-container { margin-top: 20px; padding: 15px; border: 1px solid #ccc; background-color: #fff; border-radius: 5px; }
    </style>
</head>
<body>
    <h1>JavaScript教程:从二维数组行中计算正数之和</h1>
    <div id="result-container"></div>

    <script>
        // 1. 矩阵生成部分:创建一个随机的3x3二维数组作为示例
        let myArray = [];
        const rows = 3;
        const cols = 3;

        for (let i = 0; i < rows; i++) {
            myArray[i] = [];
            for (let j = 0; j < cols; j++) {
                // 生成-9到10之间的随机整数
                myArray[i][j] = Math.floor(Math.random() * 20 - 10) + 1;
            }
        }

        console.log("原始矩阵:", myArray); // 在控制台输出原始矩阵

        // 2. 核心求和逻辑:计算每行正数之和
        let F = []; // 用于存储每行正数之和的新数组

        for (let i = 0; i < myArray.length; i++) { // 遍历矩阵的每一行
            let rowSum = 0; // **关键:为每行初始化求和变量为0**

            // 遍历当前行中的所有元素
            // myArray[i].length 确保我们遍历的是当前行的实际长度,而非固定值
            for (let j = 0; j < myArray[i].length; j++) { // **关键:从索引0开始遍历行中的所有元素**
                if (myArray[i][j] > 0) { // **关键:只累加大于0的正数**
                    rowSum += myArray[i][j];
                }
            }
            F.push(rowSum); // 将当前行的正数和添加到结果数组 F
        }

        console.log("每行正数之和数组 F:", F); // 在控制台输出结果数组

        // 3. 在HTML页面上显示结果
        document.getElementById('result-container').innerHTML = `
            <h3>原始矩阵:</h3>
            <pre>${JSON.stringify(myArray, null, 2)}</pre>
            <h3>每行正数之和数组 F:</h3>
            <pre>${JSON.stringify(F)}</pre>
        `;
    </script>
</body>
</html>

代码详解

  • 矩阵生成 (myArray): 这部分代码用于创建一个示例的3x3矩阵,其中包含介于-9到10之间的随机整数。这有助于模拟真实数据场景。
  • 结果数组 (F): F 是一个空数组,用于存储最终计算出的每行正数之和。
  • 外层循环 (for (let i = 0; i < myArray.length; i++)): 这个循环负责遍历 myArray 中的每一行。myArray.length 动态获取行数,增强了代码的通用性。
  • let rowSum = 0;: 这是解决陷阱一的关键。 在处理每一行之前,rowSum 被重置为 0。这确保了每行的求和都是从一个干净的起点开始,不受前一个元素或负数的影响。
  • 内层循环 (for (let j = 0; j < myArray[i].length; j++)): 这是解决陷阱二的关键。 这个循环遍历当前行 myArray[i] 中的所有元素。myArray[i].length 动态获取当前行的列数,确保所有元素都被检查到,包括第一个元素(索引 0)。
  • if (myArray[i][j] > 0): 这个条件判断确保只有当当前元素是正数时,才将其添加到 rowSum 中。
  • F.push(rowSum);: 在内层循环结束后(即当前行的所有元素都被处理完毕),该行的 rowSum 被添加到结果数组 F 中。

注意事项与最佳实践

  1. 初始化是关键: 对于任何累加操作,务必将累加器初始化为 0。这是避免计算错误最基本但最重要的原则。
  2. 动态获取数组长度: 使用 myArray.length 和 myArray[i].length 而不是硬编码的数字(如 3),可以使代码更具通用性和健壮性,即使矩阵的尺寸发生变化也无需修改循环条件。
  3. 清晰的变量命名: 使用如 rowSum 这样具有描述性的变量名,而不是 maxElement 或 posSum(当它可能被负数初始化时),可以大大提高代码的可读性和可维护性。
  4. 调试技巧: 在开发过程中,使用 console.log() 输出中间变量(如 myArray 和 rowSum 在每次迭代后的值)是发现和解决问题的有效方法。

总结

从二维数组(矩阵)的行中计算正数之和是一个常见的编程任务。通过本教程,我们深入探讨了两个主要的编码陷阱:累加器初始化不当和循环范围错误。通过将累加器初始化为 0,并确保内层循环遍历行中的所有元素,我们可以构建一个准确且高效的解决方案。掌握这些基本原则对于编写健壮和可靠的JavaScript代码至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

420

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

541

2024.05.29

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

497

2023.08.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

41

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

171

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号