在Node.js中将2级JSON转换为多个1级JSON

时间:2017-12-24 09:34:18

标签: javascript json node.js

我在节点中编写一个通用函数会遇到问题,它会像这样解析JSON:

{
    "parserId": 1,
    "filters": [
        {
            "filterName": "replaceTitle",
            "regex": "..."
        },
        {
            "filterName": "replaceRegion",
            "regex": "..."
        }
]}

像这样多个JSON:

{ "parserId": 1, "filterName": "replaceTitle","regex": "..." },{ "parserId": 1, "filterName": "replaceRegion", "regex": "..."}

如果这个函数是通用的,那将是很好的,所以不管JSON中字段的名称是什么,只要它以相同的方式构建。 是否有任何节点包已经在做呢?谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以映射数组的每个项目,并使用parserId附加一个带有数组项目的对象。



var object = { parserId: 1, filters: [{ filterName: "replaceTitle", regex: "..." }, { filterName: "replaceRegion", regex: "..." }] },
    array = object.filters.map(o => Object.assign({ parserId: object.parserId }, o));

console.log(array);

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




更通用的方法可以是检查属性是否为数组并稍后循环该数组或将该属性添加到公共对象,该公共对象为所有新生成的对象保留相同的值。

稍后迭代数组并将内容添加到对象中。

这可以在不指定数组属性或仅指定值的情况下工作。



function unnormalize(object) {
    var common = {};

    return Object
        .keys(object)
        .filter(k => Array.isArray(object[k]) || (common[k] = object[k], false))
        .reduce((r, k) => (object[k].forEach((o, i) => Object.assign(r[i] = r[i] || Object.assign({}, common), o)), r), []);
}

var object = { parserId: 1, filters: [{ filterName: "replaceTitle", regex: "..." }, { filterName: "replaceRegion", regex: "..." }] };

console.log(unnormalize(object));

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




答案 1 :(得分:0)

您可以使用方括号语法来提供数组的名称。然后,您可以使用map转换数组,使用Object.assign合并对象

let data = {
    "parserId": 1,
    "filters": [
        {
            "filterName": "replaceTitle",
            "regex": "..."
        },
        {
            "filterName": "replaceRegion",
            "regex": "..."
        }
]};


function format(data) {
  let array = data.filters;
  // Remove the array so that it's not duplicated
  delete data.filters;
  return array.map((item) => Object.assign(item, data));
}

console.log(format(data));