JS在循环后没有设置变量

问题描述 投票:7回答:1

我无法理解为什么我的函数不会改变变量的值。在这里我的代码。

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。 key,val中的所有数据都是正确的,但是我无法理解为什么“countarr”会返回第一次调用的结果而不是在函数内部重新设置temparr。谢谢你的答复!

javascript jquery ajax loops
1个回答
2
投票

您在每个循环上重复使用相同的countobj对象,将对该单个对象的引用重复推送到数组中。

您需要在每个循环上创建一个新对象:

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);
© www.soinside.com 2019 - 2024. All rights reserved.