ฉันค่อนข้างอืดอาดในงานปาร์ตี้อย่างไรก็ตามหากคุณต้องการโซลูชันที่แข็งแกร่งและยืดหยุ่นมากขึ้นนี่คือผลงานของฉัน หากคุณต้องการรวมเฉพาะคุณสมบัติเฉพาะในคอมโบออบเจ็กต์ / อาร์เรย์ที่ซ้อนกันตลอดจนใช้วิธีการรวมอื่น ๆ นี่คือฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่ฉันใช้ในโครงการ 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;
}
เป็นแบบวนซ้ำไม่ใช่ ES6 และควรทำงานในเบราว์เซอร์กึ่งทันสมัยส่วนใหญ่ คุณใช้สิ่งนี้:
const onlineCount = aggregateProperty(this.props.contacts, 'online', 'count');
รายละเอียดพารามิเตอร์:
obj = ทั้งอ็อบเจ็กต์หรือ
คุณสมบัติอาร์เรย์= คุณสมบัติภายในอ็อบเจ็กต์ / อาร์เรย์ที่ซ้อนกันคุณต้องการใช้เมธอดการ
รวมบนการรวม = วิธีการรวม (sum, min, max หรือ count)
ตื้น = สามารถตั้งค่าเป็น true / เท็จหรือ
ความลึกของค่าตัวเลข= ควรปล่อยให้ว่างหรือไม่ได้กำหนด (ใช้เพื่อติดตามการเรียกกลับแบบเรียกซ้ำในภายหลัง)
ตื้นสามารถใช้เพื่อเพิ่มประสิทธิภาพได้หากคุณรู้ว่าไม่จำเป็นต้องค้นหาข้อมูลที่ซ้อนกันลึก ๆ ตัวอย่างเช่นถ้าคุณมีอาร์เรย์ต่อไปนี้:
[
{
id: 1,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 2,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 3,
otherData: { ... },
valueToBeTotaled: ?
},
...
]
หากคุณต้องการหลีกเลี่ยงการวนลูปผ่านคุณสมบัติ otherData เนื่องจากค่าที่คุณกำลังจะรวมนั้นไม่ได้ซ้อนกันลึกขนาดนั้นคุณสามารถตั้งค่าตื้นเป็นจริงได้