按照transform()
文档中的Hoek示例,有没有办法在源对象中转换数组?
将示例转换为具有数组的内容,如下所示:
var source = {
address: [
{
one: '123 main street',
two: 'PO Box 1234'
},
{
one: '456 fake street',
two: 'Apt 2b'
}],
title: 'Warehouse',
state: 'CA'
};
var result = Hoek.transform(source, {
'person.address.lineOne': 'address.one',
'person.address.lineTwo': 'address.two',
'title': 'title',
'person.address.region': 'state'
});
结果:
{
person: {
address: {
lineOne: undefined,
lineTwo: undefined,
region: 'CA'
}
},
title: 'Warehouse'
}
编辑:添加预期结果:
{
person: {
address: [{
lineOne: '123 main street',
lineTwo: 'PO Box 1234',
region: 'CA'
},
{
lineOne: '465 fake street',
lineTwo: 'Apt 2b',
region: 'CA'
}]
},
title: 'Warehouse'
}
我认为我想要完成的事情超出了这种方法的范围,但我想确定这里不是用户错误。
如果它超出了hoek转换的范围,那么有关将JS对象映射到具有新键名的新对象的好方法的任何建议?
答案 0 :(得分:2)
@Gergo提供的接受答案已不再适用。在主分支上,Hoek.transform接受数组并迭代它们,转换每组底层密钥。
以下是相关的公关: https://github.com/hapijs/hoek/pull/148
主分支的自述文件(这是针对尚未发布的标记,v2.15.0
):
https://github.com/hapijs/hoek/tree/master#transformobj-transform-options
根据提供的obj和transform map将现有对象转换为新对象。选项与覆盖选项相同。第一个参数也可以是一个对象数组。在这种情况下,该方法将返回一个转换对象数组。
答案 1 :(得分:1)
Hoek无法做到这一点。 Hoek使用一对一映射,它不能以这种方式转换数组。 Hoek.transform()
遍历地图的键。它使用Hoek.reach()
从源对象获取值并将其分配给新对象:
var keys = Object.keys(transform);
for (var k = 0, kl = keys.length; k < kl; ++k) {
...
res[segment] = exports.reach(source, sourcePath, options);
}
有关详细信息,请参阅source code。如果这就是您需要做的全部,您可以轻松使用纯JavaScript:
var result = {
title: source.title,
address: []
};
source.address.forEach(function(address) {
result.address.push({
lineOne: address.one,
lineTwo: address.two,
region: source.state
});
});