2

按照Hoektransform()文档上的示例,有没有办法在源对象中转换数组?

将示例转换为带有数组的内容,如下所示:

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 对象映射到具有新键名的新对象的好方法吗?

4

2 回答 2

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 和变换映射将现有对象转换为新对象。选项与到达选项相同。第一个参数也可以是对象数组。在这种情况下,该方法将返回一个转换后的对象数组。

于 2015-07-21T06:52:56.773 回答
1

这对胡克来说是不可能的。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);
}

有关更多详细信息,请参阅源代码。如果这就是您需要做的所有事情,您可以轻松地使用纯 JavaScript:

var result = {
    title: source.title,
    address: []
};

source.address.forEach(function(address) {

    result.address.push({
        lineOne: address.one,
        lineTwo: address.two,
        region: source.state
    });
});
于 2014-10-24T20:18:54.617 回答