나는 파티에 약간 지각하지만 더 강력하고 유연한 솔루션이 필요하면 여기에 내 기여가 있습니다. 중첩 된 객체 / 배열 콤보에서 특정 속성 만 합산하고 다른 집계 메서드를 수행하려면 다음은 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 = 물체 또는 어레이 어느
속성 = 당신의 집계 방법을 수행하도록하려는 중첩 객체 / 배열 내의 속성
집합체 = 집계 방법 (합, 최소, 최대, 또는 카운트)
를 얕게 = 중 참 /으로 설정 될 수있다 false 또는 숫자 값
깊이 = null 또는 정의되지 않은 상태 여야합니다 (이후 재귀 콜백을 추적하는 데 사용됨).
깊이 중첩 된 데이터를 검색 할 필요가 없다는 것을 알고있는 경우 Shallow를 사용하여 성능을 향상시킬 수 있습니다. 예를 들어 다음 배열이있는 경우 :
[
{
id: 1,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 2,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 3,
otherData: { ... },
valueToBeTotaled: ?
},
...
]
집계 할 값이 그렇게 깊게 중첩되지 않았기 때문에 otherData 속성을 반복하지 않으려면 shallow를 true로 설정할 수 있습니다.