2016-09-05 10 views
7

Nie mogę zrozumieć, dlaczego w mojej funkcji nie zmienia się wartość zmiennej. Tutaj mój kod.JS nie ustawi zmienną po pętli

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); 

Ta funkcja jest częścią funkcji, która odpala na sukces ajax, ajax i wywołuje niektóre wybrane zmiany. Datain - wynik ajax. Po raz pierwszy zadzwoń do tej funkcji działa dobrze, ale wszystkie inne pożary zwróci mi pierwszy raz ustawić countarr. Wszystkie dane w kluczu, val - poprawne, ale nie mogę zrozumieć, dlaczego "countarr" zwraca mi wynik pierwszego wywołania, a nie ponownie ustawia temparr wewnątrz funkcji. Dzięki za odpowiedź!

Odpowiedz

2

Jesteś ponownie użyty ten sam obiekt countobj na każdej pętli, przesuwając odwołanie do tego pojedynczego obiektu wielokrotnie do tablicy.

Trzeba stworzyć nowy obiekt na każdej pętli:

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); 

Ponieważ istnieje tylko jedna właściwość, nie trzeba zmienną. Oto ten sam kod bez zmiennej iz console.log linie usunięte:

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); 

Albo można nawet użyć map; a ponieważ używasz ES2015 + (mogę powiedzieć z let), możemy użyć funkcji strzałka:

let count = function(datain) { 
    return datain.map(val => ({cost: +$(val).find("[name]").text()})); 
}; 
let countarr = count(datain); 
console.log(countarr); 

Jeśli datain jest tylko tablica podobny, a nie rzeczywiste tablicą, korzystania Array.from zamiast map:

let count = function(datain) { 
    return Array.from(datain, val => ({cost: +$(val).find("[name]").text()})); 
}; 
let countarr = count(datain); 
console.log(countarr); 
+0

Dziękujemy! To wszystko dla mnie poprawne, a teraz widzę moje błędy! Jeszcze raz dziękuję! – Doom

+2

Nice! Ale myślę, że możesz użyć drugiego argumentu w pliku Array.from, aby użyć implementacji mapy zamiast jawnie po kropce. – ajaykumar

+0

@ajaykumar: Dobra uwaga! –