【问题标题】:does hoek (hapijs) transform() handle arrays?hoek (hapijs) transform() 是否处理数组?
【发布时间】:2015-07-21 14:52:56
【问题描述】:

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

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

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

【问题讨论】:

  • 您希望结果如何?
  • @GergoErdosi,很好的问题...用这个编辑更新了问题

标签: javascript arrays json hapijs


【解决方案1】:

@Gergo 提供的接受的答案不再是这种情况。在主分支上,Hoek.transform 接受数组并对其进行迭代,转换每组底层键。

这是相关的 PR: https://github.com/hapijs/hoek/pull/148

还有主分支的自述文件(这是一个尚未发布的标签,v2.15.0): https://github.com/hapijs/hoek/tree/master#transformobj-transform-options

根据提供的 obj 和转换映射将现有对象转换为新对象。选项与到达选项相同。第一个参数也可以是对象数组。在这种情况下,该方法将返回一个转换后的对象数组。

【讨论】:

    【解决方案2】:

    这对 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
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多