난 당신이 forEach
및 reduce
가 (브라우저 버그를 무시)를 ECMA5 사양에 합리적인/유사 (단순) 또는 가능한 한 가까이하려는 경우가 의존 생각, 나는 가능한 한 가깝게 좋아 일치/합리적.
Array.prototype.forEach (callbackfn [ , thisArg ])
callbackfn 세 인수를 허용하는 기능을해야한다. forEach는 배열에있는 각 요소에 대해 한 번 callbackfn을 오름차순으로 호출합니다.callbackfn은 실제로 존재하는 배열 요소에 대해서만 호출됩니다. 배열의 누락 된 요소가 호출되지 않습니다.
thisArg 매개 변수가 제공되면 callbackfn을 호출 할 때마다이 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.
callbackfn은 요소의 값, 요소의 인덱스 및 통과 할 개체의 세 가지 인수로 호출됩니다.
forEach는 호출 된 객체를 직접 변경하지 않지만 callbackfn을 호출하여 객체를 변경할 수 있습니다.
forEach에서 처리되는 요소의 범위는 callbackfn을 처음 호출하기 전에 설정됩니다. forEach 호출 후 배열에 추가되는 요소는 callbackfn에 의해 방문되지 않습니다. 배열의 기존 요소가 변경되면 콜백에 전달 된 값은 각 방문에 대한 값이됩니다. forEach를 호출 한 후 삭제 된 요소는 방문하기 전에 방문하지 않습니다. foreach는 방법은 하나 개 또는 두 개의 인수로 호출
는 다음 단계가 수행됩니다
- 하자 O는 인수로이 값을 전달 ToObject를 호출의 결과.
- lenValue를 인수가 "length"인 O의 [Get]] 내부 메소드를 호출 한 결과로 보겠습니다.
- len을 ToUint32 (lenValue)로 설정하십시오.
- IsCallable (callbackfn)이 false 인 경우 TypeError 예외를 발생시킵니다.
- thisArg가 제공된 경우 T를 thisArg로 설정하십시오. 그렇지 않으면 T는 정의되지 않습니다.
- K < 렌 동안 K 0
- 반복하자
- 하자 ToString Pk의 수 (K).
- kPresent를 인수 Pk를 사용하여 [[HasProperty]] 내부 메소드 O를 호출 한 결과라고 합니다.
- kPresent가 참일 경우
- kValue를 인수 Pk로 O의 [Get] 내부 메소드를 호출 한 결과라고 합니다.
- 호출 복귀가 정의 1.
- 의해 kValue, K 및 O.
- 증가 (k)를 포함하는이 인자 값리스트로서 T와 callbackfn의 [[전화] 내부 방법.
foreach는 방법의 길이 속성의 foreach 함수 의도적 일반 1.
NOTE이고; 이 값이 Array 객체 일 필요는 없습니다. 따라서 다른 종류의 객체로 전송하여 메소드로 사용할 수 있습니다. forEach 함수가 호스트 객체에 성공적으로 적용될 수 있는지 여부는 구현에 따라 다릅니다.
-
Array.prototype.reduce (callbackfn [ , initialValue ])
callbackfn 네 개의 인자를받는 함수해야한다.reduce는 콜백을 함수로, 배열에있는 각 요소에 대해 한 번 오름차순으로 호출합니다.
callbackfn은 previousValue (또는 callbackfn에 대한 이전 호출의 값), currentValue (현재 요소의 값), currentIndex 및 통과되는 객체의 네 가지 인수로 호출됩니다. 콜백이 처음 호출되면 previousValue 및 currentValue는 두 값 중 하나가 될 수 있습니다. reduce에 대한 호출에서 initialValue가 제공된 경우 previousValue는 initialValue와 같고 currentValue는 배열의 첫 번째 값과 같습니다. initialValue가 제공되지 않으면 previousValue는 배열의 첫 번째 값과 같고 currentValue는 두 번째 값과 같습니다. 배열에 요소가없고 initialValue가 제공되지 않으면 TypeError입니다.
reduce는 호출 된 객체를 직접 변경하지 않지만 callbackfn을 호출하여 객체를 변경할 수 있습니다.
reduce로 처리되는 요소의 범위는 callbackfn을 처음 호출하기 전에 설정됩니다. reduce를 호출 한 후에 배열에 추가되는 요소는 callbackfn에 의해 방문되지 않습니다. 배열의 기존 요소가 변경되면 callbackfn에 전달 된 값은 reduce를 방문 할 때 값이됩니다. reduce를 호출 한 후 삭제 된 요소는 방문하기 전과 방문하기 전에 방문하지 않습니다. 줄이거 방법은 하나 개 또는 두 개의 인수로 호출
는 다음 단계가 수행됩니다
- 하자 O 인수로이 값을 전달 ToObject를 호출의 결과.
- lenValue를 인수가 "length"인 O의 [Get]] 내부 메소드를 호출 한 결과로 보겠습니다.
- len을 ToUint32 (lenValue)로 설정하십시오.
- IsCallable (callbackfn)이 false 인 경우 TypeError 예외를 발생시킵니다.
- len이 0이고 initialValue가 없으면 TypeError 예외가 발생합니다.
- 로 초기 후,로 초기에 설정
- 누산기 존재하면 k는 0
- 을하자.
- 그렇지 않으면 initialValue가 없습니다.
- kPresent를 false로 설정하십시오.
- 반복, kPresent가 거짓이고 k < len
- Pk를 ToString (k)로 지정하십시오.
- kPresent를 인수 Pk를 사용하여 [[HasProperty]] 내부 메소드 O를 호출 한 결과라고 합니다.
- kPresent가 참일 경우
- 누적 기는 인수 Pk로 O의 내부 메소드 [[Get]]을 호출 한 결과입니다.
- k를 1 늘립니다.
- kPresent가 false 인 경우 TypeError 예외를 발생시킵니다.
- 반복하면서, k < len
- Pk를 ToString (k)이라고합시다.
- kPresent를 인수 Pk를 사용하여 [[HasProperty]] 내부 메소드 O를 호출 한 결과라고 합니다.
- kPresent가 참일 경우
- kValue를 인수 Pk로 O의 [Get] 내부 메소드를 호출 한 결과라고 합니다.
- 하자 누산기 호출의 결과에서 [[전화]]를이 값과 인수 목록 함유 어큐뮬레이터 kValue, K 및 O와 같은 정의로 callbackfn 내부 방법
- 확대 K 1.
- 하여 누적 계산기를 반환합니다.
줄이거있어서의 길이 속성은 함수를 감소 1.
NOTE 의도적 총칭이고; 이 값이 Array 객체 일 필요는 없습니다. 따라서 다른 종류의 객체로 전송하여 메소드로 사용할 수 있습니다. reduce 함수를 호스트 객체에 성공적으로 적용 할 수 있는지 여부는 구현에 따라 다릅니다.
내게는 (이것들은 100 % 사양이 아니지만 가까운) 쓰고 내 개인 라이브러리에 보관하십시오. 이것은 당신이 무엇을하고 있는지에 대한 약간의 OTT 수 있습니다 물론 jsFiddle
에
function firstToCapital(inputString) {
return inputString.charAt(0).toUpperCase() + inputString.slice(1).toLowerCase();
}
function isClass(inputArg, className) {
return Object.prototype.toString.call(inputArg) === '[object ' + firstToCapital(className) + ']';
}
function checkObjectCoercible(inputArg) {
if (typeof inputArg === 'undefined' || inputArg === null) {
throw new TypeError('Cannot convert argument to object');
}
return inputArg;
};
function ToObject(inputArg) {
checkObjectCoercible(inputArg);
if (isClass(inputArg, 'boolean')) {
inputArg = new Boolean(inputArg);
} else if (isClass(inputArg, 'number')) {
inputArg = new Number(inputArg);
} else if (isClass(inputArg, 'string')) {
inputArg = new String(inputArg);
}
return inputArg;
}
function ToUint32(inputArg) {
return inputArg >>> 0;
}
function throwIfNotAFunction(inputArg) {
if (!isClass(inputArg, 'function')) {
throw TypeError('Argument is not a function');
}
return inputArg;
}
function forEach(array, fn, thisArg) {
var object = ToObject(array),
length,
index;
throwIfNotAFunction(fn);
length = ToUint32(object.length);
for (index = 0; index < length; index += 1) {
if (index in object) {
fn.call(thisArg, object[index], index, object);
}
}
}
function reduce(array, fn, initialValue) {
var object = ToObject(array),
accumulator,
length,
kPresent,
index;
throwIfNotAFunction(fn);
length = ToUint32(object.length);
if (!length && arguments.length === 2) {
throw new TypeError('reduce of empty array with no initial value');
}
index = 0;
if (arguments.length > 2) {
accumulator = initialValue;
} else {
kPresent = false;
while (!kPresent && index < length) {
kPresent = index in object;
if (kPresent) {
accumulator = object[index];
index += 1;
}
}
if (!kPresent) {
throw new TypeError('reduce of empty array with no initial value');
}
}
while (index < length) {
if (index in object) {
accumulator = fn.call(undefined, accumulator, object[index], index, object);
}
index += 1;
}
return accumulator;
}
function keys(object) {
if (!isClass(object, 'object') && !isClass(object, 'function')) {
throw new TypeError('Argument must be an object or function');
}
var props = [],
prop;
for (prop in object) {
if (object.hasOwnProperty(prop)) {
props.push(prop);
}
}
return props;
}
var inputWords = ['Apple', 'Banana', 'Apple', 'Pear', 'Pear', 'Pear'];
var counts = reduce(inputWords, function (previous, element) {
previous[element] = ++previous[element] || 1;
return previous;
}, {});
forEach(keys(counts), function (key) {
console.log(key, this[key]);
}, counts);
. :)
이것은 http://codereview.stackexchange.com에서 더 좋은 질문 일 수 있습니다. –
"ie. this works"--- (http://jsfiddle.net/7Zwc2/) – zerkms
cc @AndersonGreen 수 없습니다. –