Underscore.jsでは、Array, Object関連の関数にも凄く便利なものがあります。

first

_.first(array, [n])

配列の最初の値を返します。

(function() {
  var list = [1, 2, 5, 6, 2];
  var x = _.first(list);
  console.log(x); // => 1
})();

initial

_.initial(array, [n])

配列の最後の要素以外を返します。

(function() {
  var list = [1, 2, 5, 6, 2];
  var x = _.initial(list);
  console.log(x); // => [1,2,5,6]
})();

last

_.last(array)

配列の最後の要素以外を返します。

(function() {
  var list = [1, 2, 5, 6, 2];
  var x = _.last(list);
  console.log(x); // => 2
})();

rest

_.rest(array, [n])

[n]に指定があると、配列の後ろから[n]個の要素を返します。無い場合は先頭以外の残りの要素を返します。

(function() {
  var list = [1, 2, 5, 6, 2];
  var x = _.rest(list, 2);
  console.log(x); // => [5, 6, 2]
})();

compact

_.compact(array, [n])

配列中のfalse, null, 0, “”, undefinedを取り除きます。

(function() {
  var list = [1, null, 5, false, "", "false"];
  var x = _.compact(list);
  console.log(x); // => [1, 5, "false"]
})();

flatten

_.flatten(array, [shallow])

多次元配列を一次元化します。

(function() {
  var a = [1, [2], [3, [[{"name": "hoge"},{"name": "fuga"}]]]];
  var x = _.flatten(a);
  console.log(x); // => [1, 2, 3, object, object]
})();

without

_.without(array, [*values])

*valuesを配列中から取り除きます。

(function() {
  var a = ["hoge", 2, "fuga", 0, 3, 1, 3];
  var x = _.without(a, 0, "fuga", "3");
  console.log(x); // => ["hoge", 2, 3, 1, 3]
})();

union

_.union(*arrays)

arraysの和集合を算出します。重複を除去するイメージ。

(function() {
  var a = [1, 2, "web"];
  var b = [101, 2, 1, 10];
  var c = ["hoge", 1, "hoge", "hoge"]
  var x = _.union(a, b, c);
  console.log(x); // => [1, 2, "web", 101, 10, "hoge"] 
})();

intersection

_.intersection(*arrays)

arraysの積集合を返します。重複しているものを取り出すイメージですね。

(function() {
  var a = [1, 2, "web"];
  var b = [101, 2, 1, 10];
  var c = ["hoge", 1, 2, "hoge", "hoge"]
  var x = _.intersection(a, b, c);
  console.log(x); // => [1, 2] 
})();

difference

_.difference(array, *others)

array内の要素から、*othersに存在しないものを返します

(function() {
  var a = [10, 3, 1, 5, "hoge", "fuga"];
  var b = [2, 1, 10];
  var c = ["hoge", 1, 3];
  var x = _.difference(a, b, c);
  console.log(x); // => [5, "fuga"] 
})();

uniq

_.uniq(array, [isSorted], [iterator])

array内の重複を除去します。

(function() {
  var a = [10, 3, 1, 5, "fuga", "hoge", "fuga", 10, 3];
  var x = _.uniq(a);
  console.log(x); // => [10, 3, 1, 5, "fuga", "hoge"] 
})();

zip

_.zip(*arrays)

arraysを結合します。同じキーで連想配列の一つの値となります。

(function() {
  var a = ["surf", "huntington", 1];
  var b = ["skate", "santa monica", 10];
  var c = ["snow", "bear", 3];
  var x = _.zip(a, b, c);
  console.log(x); // => [Array["surf", "skate", "snow"], Array["huntington","santa monica","bear"], Array[1,10,3]]
})();

object

_.object(list, [values])

listをオブジェクトに変換します。キーが重複する場合は、最後の値が優先されます。

(function() {
 var a = ["key1", "bad"],
     b = ["key2", "dont know"],
     c = ["key1", "good"];
 var x = _.object([a, b, c]);
  console.log(x); // => [Object {key1: "good", key2: "dont know"} 
})();

indexOf

_.indexOf(array, value, [isSorted])

array内のvalueが無い場合、falseを返します。それ以外はインデックスを返します。

(function() {
 var a = ["surf", "snow", "skate"];
 var x = _.indexOf(a,"skate");
  console.log(x); // => 2
})();

lastIndexOf

_.lastIndexOf(array, value, [fromIndex])

array内のvalueが最後に現れるindexか、無い場合は-1を返します。

(function() {
 var a = ["surf", "snow", "skate", "surf"];
 var x = _.lastIndexOf(a,"surf");
  console.log(x); // => 3
})();

sortedIndex

_.sortedIndex(list, value, [iterator], [context])

二分探索法を使用して、valueがlist内にあるべきインデックスを返します。

(function() {
	var stooges = [{name: 'moe', age: 40}, {name: 'curly', age: 60}];
	x = _.sortedIndex(stooges, {name: 'larry', age: 50}, 'age');
	console.log(x); // => 1
})();

range

_.range([start], stop, [step])

startからstopまで、stepずつ増分されるリストを返します。start, stepは省略可能で、デフォルトではstart = 0, step = 1となっています。ループの際に重宝しそうです。

(function() {
	x = _.range(10);
	console.log(x); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
	x = _.range(1, 11);
	console.log(x); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
	x = _.range(0, 30, 5);
	console.log(x); // => [0, 5, 10, 15, 20, 25] 
	x = _.range(0, -10, -1);
	console.log(x); // => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
})();

Leave a Reply

Your email address will not be published. Required fields are marked *