一起使用.map(.range(1))的目的是什么?范围总是返回[0]?

时间:2014-12-14 03:49:05

标签: javascript angularjs underscore.js lodash

关于此输出的简单问题     var newVal = _.range(1);     的console.log(的newval);     // [0]

var STARTING_NUMBER = 1;
var _names = ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit"];

var _bgcolors = ["#FC9D9A", "#F9CDAD", "#C8C8A9"];
var _colors = ["#FE4365", "#83AF9B"]
var _generateItem = function(){
  return {
    id: Math.random(),
    name: _.sample(_names),
    bgcolor: _.sample(_bgcolors),
    color: _.sample(_colors),
    opacity: new Transitionable(0),
    transX: new Transitionable(-_width)
  }
}
//why is _.range needed? why just make STARTING_NUMBER = [0];
$scope.items = _.map(_.range(STARTING_NUMBER), function(){
      return _generateItem();
    })


setInterval(function(){
  $scope.add();
  if(!$scope.$$phase)
    $scope.$apply();
}, 1000)

2 个答案:

答案 0 :(得分:1)

当传递单个值时,range函数将返回一个整数数组:

e.g. _.range(1) returns [0],   
     _.range(2) returns [0, 1]

代码的作用是在STARTING_NUMBER为1时调用generateItem,如果STARTING_NUMBER为2则调用两次等,并将generateItem的输出添加到数组中。

它可以更简洁地编码为:

$scope.items = _.times(STARTING_NUMBER, generateItem);

答案 1 :(得分:0)

这样做是为了保持逻辑的通用性。 代码尝试做的是生成一些项(返回值的函数)并将它们存储在长度为STARTING_NUMBER的数组中。 因此,如果STARTING_NUMBER只有1个值,即1,则假设为真, 但是在这里它可以保持动态,即1或2或10 ....,$ scope.items数组将是一个等于该长度的数组。

以下是一个使用更改值的演示,其中STARTING_NUMBER = 10(已注释掉的依赖项)

演示http://jsfiddle.net/m02h0n3g/1/

var $scope = {};
var STARTING_NUMBER = 10;
var _names = ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit"];

var _bgcolors = ["#FC9D9A", "#F9CDAD", "#C8C8A9"];
var _colors = ["#FE4365", "#83AF9B"]
var _generateItem = function(){
  return {
    id: Math.random(),
    name: _.sample(_names),
    bgcolor: _.sample(_bgcolors),
    color: _.sample(_colors),
   // opacity: new Transitionable(0),
  //  transX: new Transitionable(-_width)
  }
}
//why is _.range needed? why just make STARTING_NUMBER = [0];
$scope.items = _.map(_.range(STARTING_NUMBER), function(){
      return _generateItem();
    })

console.log($scope.items);