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

Underscore.js: unexpected behavior with _.object function

本文关键字:意外 函数 object js 具有 Underscore      更新时间:2024-03-26

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

将数组转换为对象。传递单个[key,value]对列表,或者传递一个键列表和一个值列表。如果存在重复的密钥,则最后一个值获胜。

通过这个示例,它可以按预期工作。键"1"被分配了值"TEST1"。

_.object(["1", "1"], ["TEST", "TEST1"])
>> Object {1: "TEST1"}

_.object(["1", "1"], ["TEST"])
>> Object {1: undefined}

在最后一个例子中,我希望值是"TEST",但它是未定义的。

这种行为有具体的原因吗?

谢谢。

行为是正确的。第一次呼叫

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

将键1与TEST相关联,将键1和TEST1相关联(覆盖先前的关联)。

第二次呼叫:

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

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

PS:_.object的代码是:

  // 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;
  };

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