2016-09-05 13 views
7

Tôi không thể nhận được lý do tại sao chức năng của tôi không thay đổi giá trị của biến. Ở đây mã của tôi.JS không được đặt biến sau vòng lặp

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

Phần chức năng này của chức năng kích hoạt thành công ajax, ajax tôi gọi một số thay đổi được chọn. Đạt được - kết quả của ajax. Ở lần đầu tiên gọi chức năng này hoạt động tốt, nhưng tất cả các đám cháy khác trả về tôi lần đầu tiên đặt countarr. Tất cả dữ liệu trong khóa, val - chính xác, nhưng tôi không thể hiểu tại sao "countarr" trả về kết quả của cuộc gọi đầu tiên và không được thiết lập lại chức năng bên trong temparr. Cảm ơn bạn đã trả lời!

Trả lời

2

Bạn đang sử dụng lại cùng một đối tượng countobj trên mỗi vòng lặp, đẩy tham chiếu đến đối tượng đơn đó lặp lại vào mảng.

Bạn cần phải tạo một đối tượng mới trên mỗi vòng lặp:

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

Vì không chỉ là một thuộc tính, bạn không cần một biến. Dưới đây là mã tương tự mà không có sự thay đổi và với console.log dòng loại bỏ:

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

Hoặc thậm chí bạn có thể sử dụng map; và kể từ khi bạn đang sử dụng ES2015 + (tôi có thể nói từ let), chúng ta có thể sử dụng một chức năng mũi tên:

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

Nếu datain chỉ mảng giống như, không phải là một mảng thực tế, sử dụng Array.from thay vì map:

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

Cảm ơn bạn! Đó là tất cả chính xác cho tôi và bây giờ tôi thấy những sai lầm của tôi! Cám ơn bạn một lần nữa! – Doom

+2

Rất tuyệt! Nhưng tôi đoán bạn có thể sử dụng đối số thứ hai trong Array.from để sử dụng việc triển khai bản đồ thay vì rõ ràng sau dấu chấm. – ajaykumar

+0

@ajaykumar: Điểm tốt! –

Các vấn đề liên quan