Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JS,数组矩阵的差异与forEach行为

JS,数组矩阵的差异与forEach行为
EN

Stack Overflow用户
提问于 2018-10-12 10:46:52
回答 3查看 136关注 0票数 4

我正在为我的JS课程做一些培训任务,其中一个任务是必须实现一个函数,该函数接受一个正整数(n),并返回一个矩阵,如下所示(5已通过):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ [ 1, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0 ],
  [ 0, 0, 1, 0, 0 ],
  [ 0, 0, 0, 1, 0 ],
  [ 0, 0, 0, 0, 1 ] ]

我能够用以下代码实现该函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getIdentityMatrix(n) {
  const mat = new Array(n).fill([]);
  return mat.map((row, index) => {
    row = new Array(n).fill(0);
    row[index] = 1;
    return row;
  });
}

但是在做的时候我发现了一种我无法解释的奇怪的行为..。如果我稍微修改一下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getIdentityMatrix(n) {
  const mat = new Array(n).fill(new Array(n).fill(0));
  return mat.map((row, index) => {
    row[index] = 1;
    return row;
  });
}

它返回如下矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ [ 1, 1, 1, 1, 1 ],
  [ 1, 1, 1, 1, 1 ],
  [ 1, 1, 1, 1, 1 ],
  [ 1, 1, 1, 1, 1 ],
  [ 1, 1, 1, 1, 1 ] ]

为什么会这样?这就像forEach函数对嵌套在每一行中的所有元素进行迭代一样,它不应该这样做。

谢谢你的建议!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-12 10:56:13

这是因为Array是一个引用类型。当你做的时候

new Array(n).fill(new Array(n).fill(0))

首先,内部new Array(n).fill(0)使数组大小n填充0;接下来,外部Array(n).fill创建一个由对该内部数组的n个引用填充的数组。

它不创建n个内部数组,只创建对同一个数组的n个引用。因此,当您更改该内部数组的一个元素时,外部数组中的所有引用都将反映更改,因为它们都指向同一个对象。

票数 3
EN

Stack Overflow用户

发布于 2018-10-12 17:02:01

所涉守则相当于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let n = 5
let innerArr = new Array(n).fill(0)

function getIdentityMatrix(n) {
  const mat = new Array(n).fill(innerArr);
  return mat.map((row, index) => {
    row[index] = 1;
    return row;
  });
}
console.log(getIdentityMatrix(n))

因为您使用的是fill,所以基本上是用对innerArr (which you can see clearly from the above console output)的引用填充这个mat数组。

然后对每个i row[index] = 1进行,它将更改相同数组相同值(在I索引处)。

现在你的例子..。可以用较短的形式写成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const getIdentityMatrix = (n) =>
   [...Array(n)].map((row, index) => {
     row = Array(n).fill(0)
     row[index] = 1
     return row
   })

console.log(getIdentityMatrix(3))

显然,maps在新创建的n数组上,然后是spreaded数组上,但是随后用一个全新的数组引用覆盖了每个元素

由于该引用是全新的,所以使用row[index] = 1修改它会在我们从地图上进行return the x时产生预期的行为。

另一种在一行中实现这一目标的方法是通过mapObject.assignObject.values实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const gm = (n) => [...Array(n)].map((x,i) => 
   Object.values(Object.assign(Object.assign({}, Array(n).fill(0)), {[i]:1})))

console.log(gm(3))

票数 0
EN

Stack Overflow用户

发布于 2018-10-12 11:03:27

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// your example is roughly equivalent to this.
const innerArray = new Array(n).fill(0);
const mat = new Array(n).fill(innerArray);

(mat[0] === mat[1] === innerArray) === true;

只有一个嵌套数组,而不是n次数组。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52785440

复制
相关文章
【说站】js数组forEach方法的使用
1、forEach()类似于map(),它还将每个元素依次作用于传入函数,但不会返回新的数组。
很酷的站长
2022/11/26
2.8K0
【说站】js数组forEach方法的使用
JS【数组合并】的性能差异对比
Concat 是 JavaScript 的标准方法:用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
掘金安东尼
2022/09/19
3.3K0
JS【数组合并】的性能差异对比
vue遍历数组对象foreach_js遍历对象数组
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179140.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
7.6K0
vue遍历数组对象foreach_js遍历对象数组
java .foreach数组遍历_foreach遍历ArrayList和数组
遍历ArrayList的方式有迭代器,foreach循环,get(i)等方式。其中迭代器和get方法都有具体的代码可以看到。foreach循环是怎么实现的呢?
全栈程序员站长
2022/09/15
2K0
【js】for、forEach、map数组遍历性能比较
原文链接:https://blog.csdn.net/qq24357165/article/details/82748976
zz_jesse
2020/03/17
7.4K0
JS中forEach的坑
我们就按如下写了代码,但是却不能实现我们想要的结果,该方法最终会永远返回true。
码客说
2023/04/06
2.2K0
JS数组遍历方法:forEach、map、filter、reduce、some、every
2:map:对数组中的每个元素执行指定的回调函数,并返回一个新的数组,新数组由每个元素经过回调函数处理后的结果组成。
王小婷
2023/09/24
2.3K0
数组方法map的使用及与forEach的比较
大家要注意map在这里并不是地图的意思,确切的解释应该是映射!也就是说通过该方法你可以经过一些自己的逻辑处理,映射出来一个新的数组,而对原数组没有影响。 先来看一个示例,对arr的元素值乘以2,并生成一个新的数组newArr:
用户1272076
2019/03/27
9290
cssjshtml js 循环forEach
 js 循环forEach const names=new Array() resp.series.forEach(function (item,index) { names.push(item['name']) })
葫芦
2019/04/17
6.3K0
js数组中一些实用的方法(forEach,map,filter,find)
需求场景: 假若后端返回这么一个json数据格式,如下所示,我们需要拿到返回对象中的数组项,或者根据某些指定的条件,取特定的值,然后渲染到页面当中去,例如:拿name属性值
itclanCoder
2020/10/28
2.9K0
js数组中一些实用的方法(forEach,map,filter,find)
mat(矩阵)与array(数组)区别
转载 论numpy中matrix 和 array的区别 Numpy mat必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND). Matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。 在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。 import numpy as np import numpy as np a=np.
用户1733462
2018/06/01
1.4K0
js比较前后两个数组对象的差异
输出: { delData: [ { id: 1, type: ‘直尺’, price: 2 }, { id: 3, type: ‘直尺’, price: 4 }, { id: 4, type: ‘直尺’, price: 5 } ], addData: [ { id: 5, type: ‘文具盒’, price: 10 }, { id: 6, type: ‘铅笔’, price: 2 } ] }
likepoems
2023/03/08
4K0
js forEach和 map 区别
forEach() 方法按升序为数组中含有效值的每一项执行一次 callbackFn 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上,见下方的示例)。
蓓蕾心晴
2022/12/06
4.6K0
二维数组与稀疏矩阵的互转
应用: 五子棋棋盘的棋子的存档问题 思路构图: xishu.jpg SparseArray.java 运行结果 原始数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
暖月寒星
2020/03/11
8420
Js性能优化:循环正序和倒序的性能差异,以及for和foreach的性能比较
2.for和foreach的性能相近,在数据量很大,比如一千万时,foreach因为内部封装,比for更耗时
kiki.
2022/09/29
2K0
js数组、json、js对象的区别与联系
最近在敲代码时,遇上了一个关于JS数组的问题,由此引发了关于对象和json的联想,曾经觉得很畅顺的知识点突然模糊了。于是,为了理清这些东西,有了如下这篇文章。觉得没问题的猿们可以当复习,而那些带着疑问的童鞋可以细细看。当然,有任何问题欢迎指出。理清这些问题,第一步当然是找到他们的概念:js所有事物都是对象:字符串、数值、数组、函数…此外,JavaScript允许自定义对象 (1)JS数组,常态为var a = [1,2,3]的格式,用文字来形容就是一个有序数列。因为是有序的,所以里面的东西是按序排放。 (
IT架构圈
2018/05/31
9.4K0
javascript 数组遍历forEach和for用法
前言:前端开发过程中,常用到数组的遍历,我们通常采用的方式有forEach和for。下面介绍这两种方式的使用方法
侠客冷展堂
2022/01/19
1.1K0
javascript 数组遍历forEach和for用法
IQueryable与foreach的困惑?
IQueryable<Product> query = db.Products; foreach (string keyword in keywords) { string temp = keyword;     query = query.Where(p => p.Description.Contains(temp)); } 与 IQueryable<Product> query = db.Products; foreach (string keyword in keywords) {       
菩提树下的杨过
2018/01/22
9470
Parallel.ForEach与foreach相比的优势怎么体现[通俗易懂]
输出过程中,明显看到第二个循环比第一个快了很多很多,但是看最后的时间差却失望了:
全栈程序员站长
2022/09/09
5890
Parallel.ForEach与foreach相比的优势怎么体现[通俗易懂]
js 的forEach 如何跳出循环「建议收藏」
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。对于空数组不会执行回调函数
全栈程序员站长
2022/09/05
6.3K0

相似问题

JS与.NET夏令行为的差异

20

PHP与Python代码的差异-数组、Foreach循环

12

PHP 5.2.0与PHP 5.3.3中的Foreach迭代器行为差异

30

与码头货柜的行为差异

12

C# - For与Foreach性能差异巨大

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文