【问题标题】:JS not set variable after loopJS循环后未设置变量
【发布时间】:2017-01-12 12:00:28
【问题描述】:

我不明白为什么在我的函数中没有改变变量的值。这是我的代码。

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。 Datain - ajax 的结果。第一次调用此函数工作正常,但所有其他火灾都返回我第一次设置计数器。键中的所有数据,val - 正确,但我不明白为什么“countarr”会返回第一次调用的结果而不是在函数内部重新设置 temparr。 谢谢回复!

【问题讨论】:

    标签: javascript jquery ajax loops


    【解决方案1】:

    您在每个循环中重用相同的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);
    

    【讨论】:

    • 谢谢!这对我来说都是正确的,现在我看到了我的错误!再次感谢您!
    • 不错!但我想你可以使用 Array.from 中的第二个参数来使用 map 实现,而不是在 dot 之后显式使用。
    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 2014-05-05
    • 2021-02-20
    • 2021-07-27
    • 2014-09-05
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多