- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在附加代码中有几个版本的简单嵌套“for 循环”。我想为循环的每次迭代重用相同的数组,而不是每次迭代都创建一个新数组,因为显然这使用了大量内存并为收集创建了多余的垃圾。
此代码的结果应该是一个数组数组,其中包含给定的较大数组数组的子集。相同的简单代码的工作方式不同,具体取决于我用来清除外部循环内的中间一维数组以重用它的方法。具体来说,anArray=[]
用于清除 anArray,但是 anArray.length=0
和 anArray.splice(0, anArray.length)
在我的代码中产生不正确的结果。
我知道如何让它工作,我知道如何“更好”地编写代码。这是从复杂代码中的函数中提取出来的,以隔离似乎是错误的东西。我想知道的是,为什么第二个和第三个例子没有按预期工作?
披露:我为 DSP 编写了大量 C 语言和汇编代码,但我没有 JavaScript 经验。请赐教!我缺少哪些知识可以使这些结果易于理解?
如果您复制下面的代码并将其粘贴到某处以运行它,您会非常清楚地看到发生了什么。请单独复制并运行每个示例,否则它们可能会相互作用并使水域更加困惑。
有效的代码是这样的:
var sets = [
[1, 2, 3, 4, 5, 6],
[10, 20, 30, 40, 50, 60],
[100, 200, 300, 400, 500, 600]
] //given array of 3 arrays.
var singleSubset = []; // this simple array will hold a different subset each iteration.
var arrayOfSubsets = []; // this becomes the array of arrays that are subsets of the set arrays.
var subsetBounds = [1, 5]; // first and last+1 indices of the subsets to be extracted.
for (var i = 0; i < 3; i++) {
singleSubset = []; // clear this array each outer iteration so we can use .push
for (var di = subsetBounds[0]; di < subsetBounds[1]; di++) {
singleSubset.push(sets[i][di])
};
arrayOfSubsets.push(singleSubset); // push each subset array on to the output array of arrays.
}
for (j = 0; j < 3; j++) {
console.log(arrayOfSubsets[j]);
} // display result:
[2, 3, 4, 5]
[20, 30, 40, 50]
[200, 300, 400, 500]
这是预期的并且是正确的。
这是使用 .length=0 的非常相似的代码,但它不起作用:
var sets = [
[1, 2, 3, 4, 5, 6],
[10, 20, 30, 40, 50, 60],
[100, 200, 300, 400, 500, 600]
] //given array of 3 arrays.
var singleSubset = []; // this simple array will hold a different subset each iteration.
var arrayOfSubsets = []; // this becomes the array of arrays that are subsets of the set arrays.
var subsetBounds = [1, 5]; // first and last+1 indices of the subsets to be extracted.
for (var i = 0; i < 3; i++) {
singleSubset.length = 0; // clear this array each outer iteration so we can use .push
for (var di = subsetBounds[0]; di < subsetBounds[1]; di++) {
singleSubset.push(sets[i][di])
};
arrayOfSubsets.push(singleSubset); // push each subset array on to the output array of arrays.
}
for (j = 0; j < 3; j++) {
console.log(arrayOfSubsets[j]);
} // display result:
[200, 300, 400, 500]
[200, 300, 400, 500]
[200, 300, 400, 500]
这显然不是预期的,也不正确。
这是一个避免使用 .push 的版本,因此不需要在迭代之间清除中间数组。尽管如此,=[] 方法仍然有效,而且实际上仍然是必需的,否则它无法正常工作。通过根据需要取消注释,将此代码与各种清除方法中的每一种一起尝试:
var sets = [
[1, 2, 3, 4, 5, 6],
[10, 20, 30, 40, 50, 60],
[100, 200, 300, 400, 500, 600]
] //given array of 3 arrays.
var singleSubset = []; // this simple array will hold a different subset each iteration.
var arrayOfSubsets = []; // this becomes the array of arrays that are subsets of the set arrays.
var subsetBounds = [1, 5]; // first and last+1 indices of the subsets to be extracted.
for (var i = 0; i < 3; i++) {
singleSubset = []; // works and is required or it doesn't work. But comment it out and try:
// singleSubset.length = 0; // or try:
// singleSubset.splice(0, singleSubset.length); // or for extra madness try:
// singleSubset.length = 0; singleSubset = []; // as placing .length=0 ahead of =[] produces bad output too!
for (var di = subsetBounds[0]; di < subsetBounds[1]; di++) {
singleSubset[di - subsetBounds[0]] = sets[i][di];
}
arrayOfSubsets[i] = singleSubset;
}
for (j = 0; j < 3; j++) {
console.log(arrayOfSubsets[j]);
} // display result:
[200, 300, 400, 500]
[200, 300, 400, 500]
[200, 300, 400, 500]
这显然不是预期的,也不正确。
=[]
选项之前的 .length=0
产生这个:
[]
[]
[200, 300, 400, 500]
这对任何人都有意义吗?我很想知道多维数组是如何用 C 语言表达的。直观起来要容易得多!当然,如果可以使用更好的 JS 在一条语句中将二维数组的子集提取为较小的二维数组,我也会为此感谢你。
最佳答案
如果您不在每次循环中都创建一个新数组,arrayOfSubsets
的所有元素都将是对同一个数组的引用。当您改变它的长度、拼接它或将新元素推到它上面时,它们都会发生这些变化。
因此,您要么每次循环都需要创建一个新数组(这是正常方式),要么在将其推送到包含数组时制作一个副本:
arrayOfSubset.push(singleSubset.slice());
关于javascript - 在 JS 中,anArray = [] 有效,但 abArray.splice(0, anArray.length) 和 anArray.length=0 在以下代码中产生不正确的结果 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58569401/
我正在使用 JavaScript splice() 方法从数组中删除一个元素。代码如下, var fruits = ["Banana", "Orange", "Apple", "Mango"]; fu
JavaScript 拼接方法实际上将数组拆分为两个,如下例所示: var a = ['a','b','c']; var b = a.splice(0,2); console.log(a); // o
我正在尝试从包含表单输入字段的数组中删除某些值: allFields = theForm.getElementsByTagName("INPUT"); for(j = 0; j =0; j--){
var arr = document.querySelectorAll("a[href*='somestring']") 返回控制台中看起来像数组的内容。方括号 [] 和 arr.length = 7
我正在尝试从 javascript 中的数组中删除特定项目,但似乎无法使 [array].splice 函数正常工作。 此代码用于检查 SVG 对象是否与另一个对象发生碰撞(对于游戏)。玩家总是希望与
所以这是一个语法问题,我一直在阅读 MDN 文档,但我找不到类似的例子。我从这里得到了这个特定的代码片段:https://bost.ocks.org/mike/shuffle/正如我正在阅读随机数组一
这个问题在这里已经有了答案: What is the difference between call and apply? (23 个回答) 关闭 8 年前。 我正在尝试将可在函数内部访问的 arg
我有一个数组,它在任何时候都可能包含以下值的任意组合: var positions = ['first', 'second', 'third', 'fourth']; 目标是重建一个 Javascri
我运行它是为了获取 HTML 表单控制元素的集合 var elem = document.getElementById('display').elements; 我可以运行它来获取一组元素: var
如何正确使用Array.Splice? var myEmptyData = []; myEmptyData = $.parseJSON('[{ "m_sPartNumber": "B104-9
这个问题已经有答案了: Why does changing an Array in JavaScript affect copies of the array? (13 个回答) 已关闭 7 年前。
我正在为每个单击的导航容器设置一个 cookie。 它设置一个连接的数组并设置cookie值。如果再次单击,则将其从数组中删除。 它有点问题。 只有点击其他元素后才会拼接。然后它的行为就很奇怪。 可能
Javascript(使用 jQuery): var paragraphs = [ ['This is my first paragraph content of the first arra
如果我正在制作一款游戏,并且我希望某些内容仅每隔一段时间更新一次,那么解决此问题的最佳方法是什么? 我天真的想法只是保留一个通过 mod 循环的“帧”跟踪器。数学并以特定数字更新特定内容。 有更好的方
这个问题已经有答案了: How do you clone an array of objects in JavaScript? (33 个回答) using splice(0) to duplicat
我有数组 x、y 和 z。在遍历 x 时,根据条件我需要不断从 z 中删除元素。这是我正在尝试做的事情: var x = ["test0", "test1", "test2"]; var y = ["
我有 3 个包含时间段的数组,它们是字符串...像这样: $scope.shiftMorning = ['09:00', '09:30', '10:00', '10:30', '11:00', '11
我在我的表单上创建了一个功能,我可以通过单击一个按钮为多个图像添加多个文件输入,这按预期工作。现在,当我尝试使用 .splice 删除输入字段时,它会不断删除我的输入字段所在的数组的最后一项,而不是具
我必须向数组添加一些值。 代码示例: temp[0]=new Array("0","0"); temp[1]=new Array("0","0"); temp[2]=new Array("0","0"
我有一个包含字符串的数组,如果字符串中没有任何内容,我想使用 .splice() 将其从数组中删除。 不知何故,它没有得到所有空条目。如果开头有 2 个空条目,它只会得到一个。 这是我的 fiddle
我是一名优秀的程序员,十分优秀!