首页 > 解决方案 > 如何通过前缀或键将 JSON 键分组为新键?

问题描述

所以我有一个有点像这样的查询输出(使用 knex):

response = [
  {id: 1, source: 'mobile', ms_payment.id: 111, ms_payment.total: 100},
  {id: 2, source: 'mobile', ms_payment.id: 112, ms_payment.total: 210},
  ...
]

在 REST API 中返回的预期输出(映射输出)是:

result = [
  {id: 1, source: 'mobile', ms_payment: { id: 111, total: 100 }},
  {id: 2, source: 'mobile', ms_payment: { id: 112, total: 210 }},
]

有没有使用javascript的有效算法?我目前正在使用 Array.map() 手动执行此操作,它只返回预期的输出模式,没有任何循环或方法。

先感谢您。

标签: javascriptjson

解决方案


您需要迭代条目并获取嵌套对象。

const
    setValue = (object, key, value) => {
        const
            keys = key.split('.'),
            last = keys.pop();
            
        keys.reduce((o, k) => o[k] ??= {}, object)[last] = value;
        return object;
    },
    response = [{ id: 1, source: 'mobile', 'ms_payment.id': 111, 'ms_payment.total': 100 }, { id: 2, source: 'mobile', 'ms_payment.id': 112, 'ms_payment.total': 210 }],
    result = response.map(o => Object
        .entries(o)
        .reduce((r, [k, v]) => setValue(r, k, v), {})
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读