LoginSignup
0
0

More than 5 years have passed since last update.

underscoreとlodashの比較(map)

Posted at

underscoreもlodashも詳しくないので、勉強半分でソースコードを読む。

利用するバージョン

underscore.js(v1.8.3)

lodash.js(v3.10.0)

mapとは

今ある配列を元に新しい配列を作り直す関数。

配列の場合は

'use strict';

var _ = require( "underscore" );

var arr = [ 1, 2, 3 ];

var hoge = _.map( arr, function( element ) {
    return element * 3;
});

console.log( hoge ); //[ 3, 6, 9 ]

連想配列の場合は

arr = { "a": 1, "b": 2, "c": 3 };
var hoge = _.map( arr, function( element, key ) {

    return element * 3;
});

console.log( hoge ); //[ 3, 6, 9 ]

lodashも同様。

underscore.map

_.map = _.collect = function(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  var keys = !isArrayLike(obj) && _.keys(obj),
      length = (keys || obj).length,
      results = Array(length);
  for (var index = 0; index < length; index++) {
    var currentKey = keys ? keys[index] : index;
    results[index] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
};

.collectも.mapと同様。

foreach同様isArrayLikeや_.keysを用いてkeysの判定。

objがarrayだった場合は

false  //isArrayLike(obj) -> trueのため
3 // obj.length
[ , , ] //Array(3)

の形で変数が生成されて

[ "a","b","c" ]  //isArrayLike(obj) -> falseのため_.keys(obj)
3 // keys.length
[ , , ] // Array(3)

というかたちで処理される

その後、普通のfor文でのループ
currentLeyは
配列の場合はkeys -> falseのため index,
連想配列の場合はkeys[index] //ex)a,b,c

となって、それをiterateeで処理したものを返り値resultsとしてreturnする

lodash.map

function map(collection, iteratee, thisArg) {
  var func = isArray(collection) ? arrayMap : baseMap;
  iteratee = baseCallback(iteratee, thisArg, 3);
  return func(collection, iteratee);
}

lodashはまた明日に(ry

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0