下划线:平面对象的对象数组.什么是魔术?

Kae*_*lig 5 javascript underscore.js lodash

我正在改变这个对象数组:

[
  {
    first: {
      blah: 1,
      baz: 2
    }
  },
  {
    second: {
      foo: 1,
      bar: 2
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

对于这个更简单,扁平的物体:

{
  first: {
    blah: 1,
    baz: 2
  },
  second: {
    foo: 1,
    bar: 2
  }
}
Run Code Online (Sandbox Code Playgroud)

我发现使用Underscore/LoDash执行此操作的两种最简单的方法是:

// Using reduce and extend
_.reduce(myArray, _.extend)

// Using assign and apply
_.assign.apply(_, myArray);
Run Code Online (Sandbox Code Playgroud)

完整的代码记录在JSBin中:http://jsbin.com/kovuhu/1/edit?js,console

我已经阅读了很多关于apply/bind/call/assign/reduce/extend的文档......但是我无法理解窗帘背后的实际情况.

有人能帮助我理解这些单线表演的魔术技巧的秘密吗?

Mik*_*ans 2

reduce获取数组中的所有值/对象中的属性,并将它们聚合。在本例中,extend传递给reduce,这意味着您正在传递一个 function(a,b)用于扩展值a(每一步都进行)以及对象的所有属性b(数组中的每个值,一次一个)。在您的一行中,下划线reduce从对象 {} 开始遍历数组,并在沿着输入数组遍历时将所有数组元素属性简单地转储到该对象中。在普通的 JS 中,它会是这样的:

var thing = {};
var deeparray = [{...}, {...}, {...}];
deeparray.forEach(function(v) {
  Object.keys(v).forEach(function(k) {
    thing[k] = v[k];
  }
}); 
return thing;
Run Code Online (Sandbox Code Playgroud)

assign未在下划线中找到)执行相同的操作,获取一组对象并将它们全部压缩在一起。这实际上是它唯一做的事情。该调用_assign.apply(_, myArray)与 _ 调用相同this.assign(myArray)-apply是一个基本 JavaScript 函数,用于调用函数,同时“手动覆盖”this该函数内关键字的含义。_.assign.apply(_,myArray)与调用相同_.assing(myArray),但附加保证this将是 lodash,而不是某个随机函数作用域上下文。