使用下划线 transform/wrap 将整个对象变成一个新对象

Use Underscore to transform/wrap an entire object into a new object

Underscore 具有数组和函数的映射,但它们适用于单个项目,而不是整个项目。

所以假设我想在链接时更改对象的 "shape":

var result = _.chain(foo)
  .pluck(...)
  .stuff()
  .moreStuff()
  .TRANSFORMHERE()     // <------ what step/steps here to wrap the object? 
  .evenMoreStuff()
  .value();

所以像这样:

{ a: 1, b: 2, c: 3, d: 4} 

{ foo: {a: 1, b: 2, c: 3, d: 4}, bar: "hello" }

没有链接很容易。但是在链接时我可以采取哪些步骤来获取一个对象并将其作为 属性 包装在一个新对象中?

您想使用 tap.

var result = _.chain(foo)
  .pluck(...)
  .stuff()
  .moreStuff()
  .tap(function(obj) {
      obj.foo = { a : obj.a, b : obj.b, c : obj.c, d : obj.d };
      obj.bar = "hello";

      // Delete old keys
      delete obj.a;
      delete obj.b;
      delete obj.c;
      delete obj.d;
  })
  .evenMoreStuff()
  .value();

并不是说你不能做这样的事情:

tap(function(obj) {
    return {
        a : obj.a,
        ...
        bar : "hello"
    };
});

tap的结果被下划线忽略。所以你必须直接修改对象。

除非有人有better/easier/builtin方法,否则我想我们可以add a function to underscore:

_.mixin({
  wrapObject: function(obj, name) {
    var outer = {};
    outer[name] = obj;
    return outer;
  }
});