hoek(hapijs)transform()处理数组?

时间:2014-10-24 16:33:52

标签: javascript arrays json hapijs

按照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对象映射到具有新键名的新对象的好方法的任何建议?

2 个答案:

答案 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
    });
});