推入数组会产生意外的结果
Pushing into array gives unexpected result
下面的代码片段返回了意外的(至少对我来说)结果。
var input = [['one','two'],['three','four']];
var doc = {};
var output1 = [], output2 = [];
input.forEach(function(x){
doc.firstValue = x[0];
doc.secondValue = x[1];
output1.push({firstValue:x[0],secondValue:x[1]});
output2.push(doc);
})
$('#output1').html(JSON.stringify(output1));
$('#output2').html(JSON.stringify(output2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
output1 is:
<div id='output1'></div>
output2 is:
<div id='output2'></div>
问题是:
1) 为什么output1看起来与output2不相似(而它们的创建非常相似)
2) 有没有一种方法可以推入类似array.prush(obj)的数组(output2的填充方式)并获得类似output1的结果(初始数组中的所有值都会存在)?
1) 为什么output1看起来与output2不相似(而它们的创建非常相似)?
这与JavaScript中的闭包有关。
output2
数组包含对doc
对象的两个引用。这些引用都指向doc
的相同实例。
所以,当你的任务全部完成,打印output2
的内容时,你会意识到它只是打印doc
的值,这就是
{
"firstValue":"three",
"secondValue":"four"
}
2) 有没有一种方法可以推入类似array.prush(obj)的数组(output2的填充方式)并获得类似output1的结果(初始数组中的所有值都会存在)?
最简单的方法是每次使用doc
来避免关闭时创建一个新的实例:
var output1 = [], output2 = [];
input.forEach(function(x){
// Declare and define `doc` here to get unique references.
var doc = {};
doc.firstValue = x[0];
doc.secondValue = x[1];
output1.push({firstValue:x[0],secondValue:x[1]});
output2.push(doc);
});
试试这个:
var input = [['one','two'],['three','four']];
var doc = {};
var output1 = [], output2 = [];
input.forEach(function(x){
doc = {}; //this is the added line
doc.firstValue = x[0];
doc.secondValue = x[1];
output1.push({firstValue:x[0],secondValue:x[1]});
output2.push(doc);
})
$('#output1').html(JSON.stringify(output1));
$('#output2').html(JSON.stringify(output2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
output1 is:
<div id='output1'></div>
output2 is:
<div id='output2'></div>
您应该在每次迭代中创建一个新的doc object
。。。你引用了同一个对象,所以它会有最新的值…
相关文章:
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- Javascript:函数返回意外结果
- 意外结果,在 ASP.Net 中解析 JSON 对象的数组
- 按位或意外结果
- 来自 JavaScript 循环的意外结果
- 从 JavaScript 中的图像中读取像素数据会返回半透明像素的意外结果
- 在 JS 中短路空数组会产生意外结果:“[] ||真 == []'
- NodeJS中的Parse Json文件在Node中显示意外结果
- 基于给出意外结果的提示输入的逻辑
- JavaScript Regexp.test返回意外结果
- 键控产生意外结果.HTML5游戏
- Javascript do/while循环显示意外结果
- 来自 CSS 和 jQuery 的意外结果
- MongoDB mapReduce方法意外结果
- 具有意外结果的 Javascript 函数参数
- 在 JavaScript 中解析日期字符串的意外结果
- 从内部HTML更改为表单时获得意外结果,输入类型文本字段
- 在计算链逻辑表达式 JavaScript 时出现意外结果
- 意外结果 - 谷歌自动完成针对约克郡
- JavaScript unshift 参数返回意外结果