मैं पार्टी के लिए थोड़ा तनावपूर्ण हूं, हालांकि, यदि आपको अधिक मजबूत और लचीले समाधान की आवश्यकता है, तो यहां मेरा योगदान है। यदि आप किसी नेस्टेड ऑब्जेक्ट / एरे कॉम्बो में केवल एक विशिष्ट प्रॉपर्टी को समेटना चाहते हैं, साथ ही साथ अन्य एग्रीगेट तरीके भी करते हैं, तो यहाँ एक छोटा सा फंक्शन है जो मैं एक रिएक्ट प्रोजेक्ट पर उपयोग कर रहा हूँ:
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;
}
यह पुनरावर्ती, गैर ईएस 6 है, और इसे अधिकांश अर्ध-आधुनिक ब्राउज़रों में काम करना चाहिए। आप इसे इस तरह उपयोग करते हैं:
const onlineCount = aggregateProperty(this.props.contacts, 'online', 'count');
पैरामीटर टूटने:
obj = या तो एक वस्तु या एक सरणी
संपत्ति = नेस्टेड ऑब्जेक्ट्स / सरणियों के भीतर की संपत्ति जिसे आप कुल विधि = समग्र विधि (योग, अधिकतम, या गणना) उथले पर
एकत्रित करना चाहते हैं = या तो सही पर सेट किया जा सकता है / गलत या एक संख्यात्मक मान गहराई = अशक्त या अपरिभाषित छोड़ दिया जाना चाहिए (इसका उपयोग बाद के पुनरावर्ती कॉलबैक को ट्रैक करने के लिए किया जाता है)
उथले का उपयोग प्रदर्शन को बढ़ाने के लिए किया जा सकता है यदि आप जानते हैं कि आपको गहराई से नेस्टेड डेटा खोजने की आवश्यकता नहीं होगी। उदाहरण के लिए यदि आपके पास निम्न सरणी है:
[
{
id: 1,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 2,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 3,
otherData: { ... },
valueToBeTotaled: ?
},
...
]
यदि आप अन्यडेटा संपत्ति के माध्यम से लूपिंग से बचना चाहते थे, क्योंकि आप जो मूल्य एकत्र करने जा रहे हैं, वह इतना गहरा नहीं है कि आप उथले को सही पर सेट कर सकें।