2014-09-09 2 views
0

배열의 equals 인덱스 값을 다른 값에 추가하는 방법은 무엇입니까?한 쌍의 값을 다른 쌍의 값에 추가하는 방법은 무엇입니까?

은 내가 이런 식으로 뭔가를 할 수 알고 :

var i = 0, 
    a = [1, 2, 3], 
    b = [4, 5, 6], 
    total = []; 

while (i < a.length) { 
    total[i] = a[i] + b[i]; 
    i = i + 1; 
} 

console.log(total); //[5, 7, 9] 

그러나이 일을 표준 또는 빠른 방법이있다?

(내 구체적인 경우 모든 경우에 a.length === b.length).

답변

2

이 좀 더 컴팩트 찾을 수 있습니다

a.map(function(v, i) { return v + b[i]; }) 

그것은 ES6에 더욱 컴팩트합니다

a.map((v, i) => v + b[i]) 

우리는 우리 자신의 버전을 쓸 수 있습니다

function mapTwo(arr1, arr2, fn, ctxt) { 
    return arr1.map(function(v, i) { 
     return fn.call(ctxt, v, arr2[i], i); 
    }; 
} 
map 인 것입니다. 우리가 정말, 이제 많은 배열을 통해 map하는 반복을 쓸 수 원한다면 14,이제 우리는,

mapTwo(a, b, function(v1, v2) { return v1 + v2; })) 

와 함께 원래의 문제를 해결하거나 할 수 있습니다. 각 입력 배열에서 하나씩 값의 배열로 콜백을 호출합니다. sum

function sum(values) { 
    return values.reduce(function(result, val) { return result+val; }); 
} 

우리는 또한보다 일반적인 함수를 작성할 수를 여기서 우리가

mapMany([a,b], sum); 

을 할 수있는 지금

function mapMany(arrays, fn, ctxt) { 
    fn = fn.bind(ctxt); 
    return arrays[0].map(function(_, i) { 
     return fn(arrays.map(function(array) { return array[i]; }), i); 
    }; 
} 

은 입력의 각 인덱스의 요소를 결합하는 zip라고 배열을 배열로 반환하여 배열 배열을 반환합니다. 이제는 배열의 길이가 다른 경우를 처리 할 것입니다.

function zip(arrays) { 
    var result = [], 
     max = Math.max.apply(0, arrays.map(function(array) { return array.length; })); 
    for (var i=0; i<max; i++) { 
     result.push(arrays.map(function(array) { return array[i]; }); 
    } 
    return result; 
} 

이제 우리는

zip([a,b]).map(sum) 
와 쌍대 합계를 만들 수 있습니다
0

아니요, 실제로이 작업을 수행하는 '표준'방법은 없습니다. 어쩌면 LoDash과 같은 라이브러리를 사용하면 도움이 될 것입니다. 특히 .zip() 기능에 대해 살펴 것은

관련 문제