使用下划线 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;
}
});
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;
}
});