[javascript] 객체의 자바 스크립트 reduce ()
Array reduce()
에서 하나의 값을 얻는 멋진 Array 메소드 가 있습니다. 예:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
객체와 동일하게 만드는 가장 좋은 방법은 무엇입니까? 나는 이것을하고 싶다 :
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
그러나 Object에는 reduce()
메서드가 구현 되지 않은 것 같습니다 .
답변
이 경우 실제로 원하는 것은 Object.values
입니다. 다음은 이를 염두에 둔 간결한 ES6 구현입니다.
const add = {
a: {value:1},
b: {value:2},
c: {value:3}
}
const total = Object.values(add).reduce((t, {value}) => t + value, 0)
console.log(total) // 6
또는 간단히 :
const add = {
a: 1,
b: 2,
c: 3
}
const total = Object.values(add).reduce((t, n) => t + n)
console.log(total) // 6
답변
하나의 옵션은 다음 reduce
과 keys()
같습니다.
var o = {
a: {value:1},
b: {value:2},
c: {value:3}
};
Object.keys(o).reduce(function (previous, key) {
return previous + o[key].value;
}, 0);
이를 통해 초기 값을 지정하거나 첫 번째 라운드는입니다 'a' + 2
.
결과를 Object ( { value: ... }
)로 사용하려면 매번 객체를 초기화하고 반환해야합니다.
Object.keys(o).reduce(function (previous, key) {
previous.value += o[key].value;
return previous;
}, { value: 0 });
답변
ES6 구현 : Object.entries ()
const o = {
a: {value: 1},
b: {value: 2},
c: {value: 3}
};
const total = Object.entries(o).reduce(function (total, pair) {
const [key, value] = pair;
return total + value;
}, 0);
답변
우선, 이전 값이 줄어드는 것을 얻지 못합니다 .
의사 코드에는가 return previous.value + current.value
있으므로 previous
객체가 아닌 다음 호출시 값이됩니다.
둘째, reduce
객체가 아닌 Array 메서드이며 객체의 속성을 반복 할 때 순서에 의존 할 수 없습니다 ( https://developer.mozilla.org/en-US/docs/ JavaScript / Reference / Statements / for … in , 이것은 Object.keys 에도 적용됩니다 ); 신청 여부는 확실하지 않습니다reduce
객체 위에 하는 것이 의미가 .
그러나 주문이 중요하지 않은 경우 다음을 수행 할 수 있습니다.
Object.keys(obj).reduce(function(sum, key) {
return sum + obj[key].value;
}, 0);
또는 객체의 값을 매핑 할 수 있습니다 .
Object.keys(obj).map(function(key) { return this[key].value }, obj).reduce(function (previous, current) {
return previous + current;
});
팻 화살표 함수 구문 (Firefox Nightly에서 이미 사용됨)을 사용하는 ES6의 PS에서는 약간 축소 할 수 있습니다.
Object.keys(obj).map(key => obj[key].value).reduce((previous, current) => previous + current);
답변
1:
[{value:5}, {value:10}].reduce((previousValue, currentValue) => { return {value: previousValue.value + currentValue.value}})
>> Object {value: 15}
2 :
[{value:5}, {value:10}].map(item => item.value).reduce((previousValue, currentValue) => {return previousValue + currentValue })
>> 15
삼:
[{value:5}, {value:10}].reduce(function (previousValue, currentValue) {
return {value: previousValue.value + currentValue.value};
})
>> Object {value: 15}
답변
Object.prototype을 확장하십시오.
Object.prototype.reduce = function( reduceCallback, initialValue ) {
var obj = this, keys = Object.keys( obj );
return keys.reduce( function( prevVal, item, idx, arr ) {
return reduceCallback( prevVal, item, obj[item], obj );
}, initialValue );
};
사용 샘플.
var dataset = {
key1 : 'value1',
key2 : 'value2',
key3 : 'value3'
};
function reduceFn( prevVal, key, val, obj ) {
return prevVal + key + ' : ' + val + '; ';
}
console.log( dataset.reduce( reduceFn, 'initialValue' ) );
'Output' == 'initialValue; key1 : value1; key2 : value2; key3 : value3; '.
조이, 얘들 아 !! 😉
답변
생성기 표현식 (현재 수년간 모든 브라우저에서 지원되고 노드에서)을 사용하여 줄일 수있는 목록에서 키-값 쌍을 얻을 수 있습니다.
>>> a = {"b": 3}
Object { b=3}
>>> [[i, a[i]] for (i in a) if (a.hasOwnProperty(i))]
[["b", 3]]