Tuy nhiên, tôi hơi muộn đối với bữa tiệc, nếu bạn yêu cầu một giải pháp linh hoạt và mạnh mẽ hơn thì đây là đóng góp của tôi. Nếu bạn chỉ muốn tính tổng một thuộc tính cụ thể trong tổ hợp đối tượng / mảng lồng nhau, cũng như thực hiện các phương thức tổng hợp khác, thì đây là một hàm nhỏ mà tôi đã sử dụng trên một dự án React:
var aggregateProperty = function(obj, property, aggregate, shallow, depth) {
if ((typeof obj !== 'object' && typeof obj !== 'array') || !property) {
return;
}
obj = JSON.parse(JSON.stringify(obj));
const validAggregates = [ 'sum', 'min', 'max', 'count' ];
aggregate = (validAggregates.indexOf(aggregate.toLowerCase()) !== -1 ? aggregate.toLowerCase() : 'sum');
if (shallow === true) {
shallow = 2;
} else if (isNaN(shallow) || shallow < 2) {
shallow = false;
}
if (isNaN(depth)) {
depth = 1;
}
var value = ((aggregate == 'min' || aggregate == 'max') ? null : 0);
for (var prop in obj) {
if (!obj.hasOwnProperty(prop)) {
continue;
}
var propValue = obj[prop];
var nested = (typeof propValue === 'object' || typeof propValue === 'array');
if (nested) {
if (prop == property && aggregate == 'count') {
value++;
}
if (shallow === false || depth < shallow) {
propValue = aggregateProperty(propValue, property, aggregate, shallow, depth+1);
} else {
continue;
}
}
if ((prop == property || nested) && propValue) {
switch(aggregate) {
case 'sum':
if (!isNaN(propValue)) {
value += propValue;
}
break;
case 'min':
if ((propValue < value) || !value) {
value = propValue;
}
break;
case 'max':
if ((propValue > value) || !value) {
value = propValue;
}
break;
case 'count':
if (propValue) {
if (nested) {
value += propValue;
} else {
value++;
}
}
break;
}
}
}
return value;
}
Nó là đệ quy, không phải ES6, và nó sẽ hoạt động trong hầu hết các trình duyệt bán hiện đại. Bạn sử dụng nó như thế này:
const onlineCount = aggregateProperty(this.props.contacts, 'online', 'count');
Phân tích thông số:
obj = hoặc một đối tượng hoặc một mảng
bất động sản = tài sản trong phạm vi các đối tượng lồng nhau / mảng bạn muốn thực hiện các phương pháp tổng hợp về
tổng hợp = phương pháp tổng hợp (Tóm lại, min, max, hoặc đếm)
cạn = hoặc có thể được thiết lập để / đúng false hoặc giá trị số
chiều sâu = phải được để trống hoặc không xác định (nó được sử dụng để theo dõi các lệnh gọi lại đệ quy tiếp theo)
Có thể sử dụng Shallow để nâng cao hiệu suất nếu bạn biết rằng bạn sẽ không cần phải tìm kiếm dữ liệu lồng ghép sâu. Ví dụ: nếu bạn có mảng sau:
[
{
id: 1,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 2,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 3,
otherData: { ... },
valueToBeTotaled: ?
},
...
]
Nếu bạn muốn tránh lặp qua thuộc tính OtherData vì giá trị bạn sắp tổng hợp không được lồng sâu như vậy, bạn có thể đặt nông thành true.