Underscore.js:_.object函数的意外行为

时间:2013-12-06 08:06:23

标签: javascript underscore.js

以下是_.object函数的文档中的描述。

  

将数组转换为对象。传递单个[键,值]对列表或键列表以及值列表。如果存在重复键,则最后一个值获胜。

通过此示例,它按预期工作。 “1”的键被赋值为“TEST1”。

_.object(["1", "1"], ["TEST", "TEST1"])

>> Object {1: "TEST1"}


_.object(["1", "1"], ["TEST"])

>> Object {1: undefined}

在最后一个例子中,我希望该值为“TEST”,但未定义。

此行为是否有特定原因?

感谢。

1 个答案:

答案 0 :(得分:2)

行为是正确的。第一次电话

_.object(["1", "1"], ["TEST", "TEST1"])

将密钥1与TEST关联,密钥1与TEST1关联(覆盖先前的关联)。

第二个电话:

_.object(["1", "1"], ["TEST"])

具有相同的逻辑,但第二个键1与'values'数组中第二个位置的元素相关联,这是未定义的。

PS:_.object的{​​{3}}就是:

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values.
  _.object = function(list, values) {
    if (list == null) return {};
    var result = {};
    for (var i = 0, length = list.length; i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  };

似乎他们确实指定数组需要具有相同的长度。从代码中可以明显看出,如果第二个数组较大,则忽略最后一个值,如果它较小,则最后一个值将是未定义的。