JavaScript giảm lỗi ném cho nhiều hơn hai mục
Tôi có mảng này:
const arr = [
{ someProp: [{ amount: 10 }]},
{ someProp: [{ amount: 12 }]},
];
và sau đó điều này làm giảm fn:
const sum = arr.reduce((prev, curr) => prev.someProp[0].amount + curr.someProp[0].amount);
Nó hoạt động nếu có hai mục trong mảng nhưng với ba mục, nó ném:
Không thể đọc thuộc tính "0" của undefined "
Trả lời
Trên thực tế, bạn chỉ cần trả lại bộ tích lũy + giá trị mới.
Bạn muốn bắt đầu với 0tôi đoán vì vậy bạn cần thêm 0làm tham số thứ hai
const arr =
[
{ someProp: [{ amount: 10 }]},
{ someProp: [{ amount: 12 }]},
{ someProp: [{ amount: 12 }]},
];
const sum = arr.reduce((acc, item) => item.someProp[0].amount + acc, 0);
console.log(sum);
Nếu bạn muốn nó cay hơn ở đây với hủy cấu trúc
const arr =
[
{ someProp: [{ amount: 10 }]},
{ someProp: [{ amount: 12 }]},
{ someProp: [{ amount: 12 }]},
];
const sum = arr.reduce((acc, { someProp: [{ amount }] }) => amount + acc, 0);
console.log(sum);
Sau câu trả lời @Pointy, đây là cách bạn có thể làm cho nó hoạt động với bất kỳ số phần tử nào:
const sum = arr.reduce((prev, curr) => prev + curr.someProp[0].amount, 0);
prevluôn là phần tử được trả về trước đó, vì vậy bạn có thể sử dụng nó như một số một cách an toàn (và vì bạn chỉ tính tổng nó, bạn có thể sử dụng 0 làm mặc định, vì vậy lần đầu tiên reduceđược gọi, giá trị của prevsẽ là 0)
Bạn đang trả lại một số. Giá trị của prevluôn là giá trị trả về trước từ lệnh gọi lại, không phải phần tử trước đó. Vì vậy, trong lần lặp thứ ba, bạn đang cố gắng sử dụng số đó như thể nó là một tham chiếu đối tượng.
Thêm tham số thứ hai (0) vào lệnh .reduce()gọi và thay đổi hàm để coi prevnhư tổng đang chạy (một số đơn giản):
const sum = arr.reduce((prev, curr) => prev + curr.someProp[0].amount, 0);
Nó hoạt động như hiện tại khi có hai phần tử bởi vì không có tham số thứ hai đó, lần lặp đầu tiên sẽ thấy phần tử 0 là prevvà phần tử 1 là curr. Hành vi đó hoạt động tốt khi bạn có một mảng số và bạn chỉ muốn thực hiện phép tính giữa chúng, nhưng trong trường hợp này, bạn cần giá trị ban đầu đó một cách rõ ràng ở đó làm đối số thứ hai.
Đây là một giải pháp thay thế ... Sử dụng Array.filter().
const arr = [{
someProp: [{
amount: 10
}]
},
{
someProp: [{
amount: 12
}]
},
{
someProp: [{
amount: -231
}]
},
{
someProp: [{
amount: 21265
}]
},
{
someProp: [{
amount: 1239
}]
},
{
someProp: [{
amount: -6
}]
},
];
const sum = arr.filter((val, index) => {
if (index > 0) {
arr[index].someProp[0].amount = parseInt(val.someProp[0].amount) + parseInt(arr[index - 1].someProp[0].amount);
}
return index == arr.length - 1;
})[0].someProp[0].amount;
console.log(sum);