29921

[code]

    var a = [1, 2, 3];
    var b = [1, 2, 4];
    var c = [];
    for (var i = 0; i < a.length; i++){
        c[i] = (a[i] == b[i]);
    }
    
[/code]

このような複数の配列の操作を、以下のようなArray.prototype.map()を使って記述するにはどうすればよいでしょうか？

[code]

    c = a.map(element => {
        /*なにか*/
    });
    
[/code]

できれば、以下のようなindexは使いたくありません。

[code]

    c = a.map((element, index) => {
    　  return element == b[index];
    });
    
[/code]


CC BY-SA 3.0
2016-10-26T12:47:36.080
29920
2018-03-31T01:23:27.027
19327
question
javascript
JavaScriptのArray.prototype.map()で複数の配列を操作するには？


map関数は各要素に関数を適用するだけなので、複数の配列を束ねるzip関数を使うことになります。が、残念ながらzip関数はJavaScriptにはありません。

[Underscore.js](http://underscorejs.org/#zip) や
[Prototype.js](http://api.prototypejs.org/language/Enumerable/prototype/zip/)
に入っているものを使うか、自前で実装するか（[例](https://stackoverflow.com/a/10284006/2818869)）、あきらめて他の方法にするか、というところかと思います。


CC BY-SA 3.0
2016-10-26T13:12:52.883
29921
2016-10-26T13:12:52.883
2017-05-23T12:38:55.250
-1
8000
29920
answer


**配列 a の要素がユニークな場合**

[code]

    c = a.map(element => {
      return element == b[a.lastIndexOf(element)]
    });
    
[/code]

同じ要素が複数ある場合には意味がありませんので実用的ではないですね…

**配列 b をコピーしても良い場合**

[code]

    bb = b.concat();
    c = a.map(element => {
      r = (element == bb[0])
      bb.shift()
      return r
    });
    
[/code]

`Array.shift()` を実行することで比較対象が常に配列の先頭(`bb[0]`)にある様にしています。


CC BY-SA 3.0
2016-10-26T13:40:55.183
29924
2016-10-26T13:40:55.183
29920
answer


僕の考えでは、あなたの使いたくないというその手が最適だと思います。  
いっそ関数にしてしまえば使いやすいのでは?

[code]

    const zipWith = f => xs => ys => 
      xs.length < ys.length ? xs.map((e,i)=>f(e,ys[i])) : ys.map((e,i)=>f(xs[i],e));
    const zipEq = zipWith( (x, y) => x === y );
    
    let a = [1, 2, 3];
    let b = [1, 2, 4];    
    let c = zipEq(a)(b) //=> [true,true,false]
    
[/code]


CC BY-SA 3.0
2018-03-28T07:06:55.887
42699
2018-03-31T01:23:27.027
2018-03-31T01:23:27.027
9751
9751
29920
answer