使用Underscore将整个对象转换/包装为新对象

时间:2015-10-30 12:25:36

标签: javascript underscore.js

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

所以假设我想在链接时更改对象的“形状”:

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" }

没有链接就很容易。但是,在链接时,我可以采取什么步骤来获取对象并将其作为新对象中的属性包装?

2 个答案:

答案 0 :(得分:1)

您想使用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的结果。所以你必须直接修改对象。

答案 1 :(得分:0)

除非某人有更好/更容易/内置的方式,否则我猜我们可以add a function to underscore

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