2016-06-23 1 views
0

配列がnであると仮定します。これらの配列の各項目間で操作を行う簡単な方法はありますか?配列の項目間で操作を行う

例:2つの配列

arr1 = [true,false,false,true] 

arr2 = [false,true,false,true] 

私はAND操作をしたいのですが:

期待される結果:

[false,false,false,true] 

あなたは私にこれを行うためのいくつかのヒントを与えることはできますか?

+1

使用[ '.MAP()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)または 'for'ループ?何を試しましたか? – nnnnnn

答えて

4

これは、Array#reduceと、[arr1, arr2, ...]のような任意の長さの配列の提案です。

function and(array) { 
 
    return array.reduce(function (r, a) { 
 
     return r.map(function (b, i) { 
 
      return a[i] && b; 
 
     }); 
 
    }); 
 
} 
 

 
var arr1 = [true, false, false, true], 
 
    arr2 = [false, true, false, true], 
 
    result = and([arr1, arr2]); 
 

 
console.log(result);

ES6

var and = array => array.reduce((r, a) => r.map((b, i) => a[i] && b)), 
 
    arr1 = [true, false, false, true], 
 
    arr2 = [false, true, false, true], 
 
    result = and([arr1, arr2]); 
 

 
console.log(result);

1

使用Array#forEach

arr1 = [true, false, false, true] 
 
arr2 = [false, true, false, true]; 
 
var op = []; 
 
arr1.forEach(function(item, i) { 
 
    op.push(item && arr2[i]); 
 
}); 
 
console.log(op);

+0

配列が50個の場合はどうなりますか? – Bob

+0

あなたは 'n'配列を持つことができますが、両方の配列は同じ' length'を持つ必要があります – Rayon

+0

@Downvoter、あなたのコメントは貴重です! – Rayon

1

JavaScriptを使用Array#forEach方法

var arr1 = [true, false, false, true], 
 
    arr2 = [false, true, false, true]; 
 

 
// put all arrays inside a single array 
 
var arrs = [arr1, arr2]; 
 
// set result as initial array values 
 
var res = arrs[0]; 
 
// iterate over remaining array 
 
arrs.slice(1).forEach(function(v, i) { 
 
    // iterate over array values and apply logical and operation 
 
    arr1.forEach(function(item, i) { 
 
    res[0] = res[0] && arr2[i]; 
 
    }); 
 
}) 
 
console.log(res);

非常に単純な実装後

var arrs = [ 
    [...], 
    [...] 
]; 


かのアレイにあなたの N配列を入れてみましょう、機能説明を簡単にするため

var arr1 = [true, true, false, true], 
 
    arr2 = [false, true, false, true], 
 
    arr3 = [false, true, false, false]; 
 

 
function combine(...arrs) { 
 
    // set result as first array 
 
    var res = arrs[0]; 
 
    // iterate over remaining array 
 
    arrs.slice(1).forEach(function(v, i) { 
 
    // iterate over array values and apply logical and operation 
 
    arr1.forEach(function(item, i) { 
 
     res[0] = res[0] && arr2[i]; 
 
    }); 
 
    }); 
 
    return res; 
 
} 
 
console.log(combine(arr1, arr2, arr3));

+0

配列が50個の場合はどうなりますか? – Bob

+0

@Bob:updated .. –

3

としてそれを定義しますループのみを使用:

var result = []; 
for (var i = 0; i < arrs[0].length; i++) { 
    var value = arrs[0][i]; 
    for (var j = 1; j < arrs.length; j++) { 
     value = value && arrs[j][i]; 
    } 
    results.push(value); 
} 

iカウンタが最初の配列は水平に、jカウンタが垂直あなたNアレイを横切る横断します。

0

これは私の解決策になる...あなたは、あなたの操作を保持し、内部でそれをスローするようにコールバックを定義することができますマップファンクタ。最初のスニペットはあなたの質問を表示し答えます.2番目のスニペットは一般的に答えを出します。

var arrs = [[true,false,false,true,true,true],[false,true,false,true,true,true],[false,true,true,true,true,false]], 
 
    result = arrs.reduce((p,c) => p.map((e,i) => e && c[i])); 
 
console.log(result);

var arrs = [[true,false,false,true,true,true],[false,true,false,true,true,true],[false,true,true,true,true,false]], 
 
crashemall = (ar,cb) => ar.reduce((p,c) => p.map((e,i) => cb(e,c[i]))), 
 
     cb1 = (a,b) => a || b, 
 
     cb2 = (a,b) => !a && b 
 
    result1 = crashemall(arrs,cb1), 
 
    result2 = crashemall(arrs,cb2); 
 
console.log(result1); 
 
console.log(result2);