我无法理解为什么我的函数不会改变变量的值。这是我的代码。
var count = function(datain){
let temparr = [],
countobj = {};
$.each(datain, function(key, val) {
console.log(temparr);
countobj.cost = +$(val).find("[name]").text();
console.log(countobj);
temparr.push(countobj);
console.log(temparr);
});
console.log(temparr);
return temparr;
};
let countarr = count(datain);
console.log(countarr);
这个函数部分函数触发了ajax成功,ajax我调用了一些select变量。 Datain - ajax的结果。第一次调用此函数工作正常,但所有另一个火灾返回我第一次设置countarr。密钥中的所有数据,val - 正确,但我不明白为什么" countarr"返回第一次调用的结果,而不是在函数内重新设置temparr。 谢谢你的回复!
答案 0 :(得分:2)
你在每个循环中重用相同的countobj
对象,将对该单个对象的引用重复推送到数组中。
您需要在每个循环上创建 new 对象:
var count = function(datain) {
let temparr = [],
countobj; // ***
$.each(datain, function(key, val) {
countobj = {}; // ***
console.log(temparr);
countobj.cost = +$(val).find("[name]").text();
console.log(countobj);
temparr.push(countobj);
console.log(temparr);
});
console.log(temparr);
return temparr;
};
let countarr = count(datain);
console.log(countarr);
由于只有一个属性,因此您不需要变量。这是没有变量且删除了console.log
行的相同代码:
var count = function(datain) {
let temparr = [];
$.each(datain, function(key, val) {
temparr.push({cost: +$(val).find("[name]").text()});
});
return temparr;
};
let countarr = count(datain);
console.log(countarr);
或者您甚至可以使用map
;既然你正在使用ES2015 +(我可以告诉let
),我们可以使用箭头功能:
let count = function(datain) {
return datain.map(val => ({cost: +$(val).find("[name]").text()}));
};
let countarr = count(datain);
console.log(countarr);
如果datain
只是数组,而不是实际数组,请使用Array.from
代替map
:
let count = function(datain) {
return Array.from(datain, val => ({cost: +$(val).find("[name]").text()}));
};
let countarr = count(datain);
console.log(countarr);