我在节点中编写一个通用函数会遇到问题,它会像这样解析JSON:
{
"parserId": 1,
"filters": [
{
"filterName": "replaceTitle",
"regex": "..."
},
{
"filterName": "replaceRegion",
"regex": "..."
}
]}
像这样多个JSON:
{ "parserId": 1, "filterName": "replaceTitle","regex": "..." },{ "parserId": 1, "filterName": "replaceRegion", "regex": "..."}
如果这个函数是通用的,那将是很好的,所以不管JSON中字段的名称是什么,只要它以相同的方式构建。 是否有任何节点包已经在做呢?谢谢您的帮助!
答案 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));