0

我需要根据用户选择的下拉列表创建一定数量的对象。现在我有这个代码。

var driversFunc = function () {

var driversCount = osagoViewModel.fields.driversCount.selectedValue();

switch (driversCount) {

    case "many":
        return [];
    case "1":
        return [new driver()];
    case "2":
        return [new driver(), new driver()];
    case "3":
        return [new driver(), new driver(), new driver()];
    case "4":
        return [new driver(), new driver(), new driver(), new driver()];
    case "5":
        return [new driver(), new driver(), new driver(), new driver(), new driver()];
    }
};

(使用knockout.js)

4

3 回答 3

2

您的交换机可能可以替换为:

if (driversCount === "many") {
  return [];
} else {
  var count = parseInt(driversCount, 10);
  var l = [];
  while (count--) l.push(new driver());
  return l;
}

我不明白为什么many映射到[].

于 2012-05-05T11:42:53.960 回答
1

我不知道上下文,但您的代码可以使用 for 循环重写:

var driversFunc = function () {
    var driversCount = osagoViewModel.fields.driversCount.selectedValue();
    var result = [];
    if (driversCount != "many") {
        for (var i = 0; i < (+driversCount || 0); i++) {
            result.push(new driver());
        }
    }
    return result;
};
于 2012-05-05T11:44:15.913 回答
1

试试这个:

return Number(driversCount) 
        ? ( function add(i){ 
             return i ? add(i-1).concat(new driver) : [] 
            }(driversCount) 
           )
        : [];

或者1

return Number(driversCount) 
        ? String(new Array(driversCount))
          .split(',')
          .map(function(){return new driver})
        : [];

1String(new Array([n])).split ...语法是强制应用该map方法的一个小技巧(不起作用new Array([n]).map(...))。

于 2012-05-05T11:49:50.240 回答