将单个对象拆分为多个对象
Split up single object into multiple objects
我有一个 JSON 对象,我想拆分成多个对象。我试过将单个 JSON 对象转换为数组。如果缺少键(即 meal1、meal2 等),我无法找出分解单个对象的模式。我什至不确定这是否是最佳方法。感谢任何正确方向的帮助或指示!
之前
{
"fullName1" : "John Doe",
"attendance1" : 1,
"meal1" : "salmon",
"fullName2" : "Jane Doe",
"attendance2" : 0
}
想要的结果
{
"fullName" : "John Doe",
"attendance" : 1,
"meal" : "salmon"
},
{
"fullName" : "Jane Doe"
"attendance" : 0
}
就我的尝试而言,这是我取得的进展:
const entries = [...elements];
// check for valid elements
const isValidElement = element => {
return element.name && element.value;
};
const isValidValue = element => {
return (!['radio'].includes(element.type) || element.checked);
};
const formToJSON = elements =>
[].reduce.call(elements, (data, element) => {
if (isValidElement(element) && isValidValue(element)) {
data[element.name] = element.value;
}
return data;
}, {});
//
const singleArray = formToJSON(entries);
不知道会有多少个对象,最好将它们拆分成一个对象数组。首先遍历键然后检查它的索引。这假设键总是以数字结尾,最后的数字总是索引。
var obj = {
"fullName1" : "John Doe",
"attendance1" : 1,
"meal1" : "salmon",
"fullName2" : "Jane Doe",
"attendance2" : 0
};
var objs = [];
Object.keys(obj).forEach(function(key) {
var match = key.match(/(.*)(\d.*)$/);
var newKey = match[1];
var index = parseInt(match[2]) - 1;
objs[index] = objs[index] || {};
objs[index][newKey] = obj[key];
})
console.log(objs);
您可以像下面那样使用 Object.entries
和 reduce
来实现这个
遍历对象中的每条记录,并将键的最后数字存储在临时对象中。
let obj = {
"fullName1" : "John Doe",
"attendance1" : 1,
"meal1" : "salmon",
"fullName2" : "Jane Doe",
"attendance2" : 0
}
let res = Object.entries(obj).reduce((o, [k, v]) => {
let [name, number] = k.match(/\D+|\d+$/g)
o[number] = { ...(o[number] || {}), [name]: v }
return o
}, {})
console.log(Object.values(res))
这里是如何分成三个相等的块
const splitIntoThreeChunks = (obj) => {
let obj1 = {}
let obj2 = {}
let obj3 = {}
const keys = Object.keys(obj)
const keysLength = keys.length
let k = 0
for (let i = 0; i <= keysLength; i++) {
const key = keys[i]
if (k === 0) {
obj1 = { ...obj1, [key]: obj[key] }
k++
} else if (k === 1) {
obj2 = { ...obj2, [key]: obj[key] }
k++
} else if (k === 2) {
obj3 = { ...obj3, [key]: obj[key] }
k = 0
}
}
return {
obj1,
obj2,
obj3
}
}
我有一个 JSON 对象,我想拆分成多个对象。我试过将单个 JSON 对象转换为数组。如果缺少键(即 meal1、meal2 等),我无法找出分解单个对象的模式。我什至不确定这是否是最佳方法。感谢任何正确方向的帮助或指示!
之前
{
"fullName1" : "John Doe",
"attendance1" : 1,
"meal1" : "salmon",
"fullName2" : "Jane Doe",
"attendance2" : 0
}
想要的结果
{
"fullName" : "John Doe",
"attendance" : 1,
"meal" : "salmon"
},
{
"fullName" : "Jane Doe"
"attendance" : 0
}
就我的尝试而言,这是我取得的进展:
const entries = [...elements];
// check for valid elements
const isValidElement = element => {
return element.name && element.value;
};
const isValidValue = element => {
return (!['radio'].includes(element.type) || element.checked);
};
const formToJSON = elements =>
[].reduce.call(elements, (data, element) => {
if (isValidElement(element) && isValidValue(element)) {
data[element.name] = element.value;
}
return data;
}, {});
//
const singleArray = formToJSON(entries);
不知道会有多少个对象,最好将它们拆分成一个对象数组。首先遍历键然后检查它的索引。这假设键总是以数字结尾,最后的数字总是索引。
var obj = {
"fullName1" : "John Doe",
"attendance1" : 1,
"meal1" : "salmon",
"fullName2" : "Jane Doe",
"attendance2" : 0
};
var objs = [];
Object.keys(obj).forEach(function(key) {
var match = key.match(/(.*)(\d.*)$/);
var newKey = match[1];
var index = parseInt(match[2]) - 1;
objs[index] = objs[index] || {};
objs[index][newKey] = obj[key];
})
console.log(objs);
您可以像下面那样使用 Object.entries
和 reduce
来实现这个
遍历对象中的每条记录,并将键的最后数字存储在临时对象中。
let obj = {
"fullName1" : "John Doe",
"attendance1" : 1,
"meal1" : "salmon",
"fullName2" : "Jane Doe",
"attendance2" : 0
}
let res = Object.entries(obj).reduce((o, [k, v]) => {
let [name, number] = k.match(/\D+|\d+$/g)
o[number] = { ...(o[number] || {}), [name]: v }
return o
}, {})
console.log(Object.values(res))
这里是如何分成三个相等的块
const splitIntoThreeChunks = (obj) => {
let obj1 = {}
let obj2 = {}
let obj3 = {}
const keys = Object.keys(obj)
const keysLength = keys.length
let k = 0
for (let i = 0; i <= keysLength; i++) {
const key = keys[i]
if (k === 0) {
obj1 = { ...obj1, [key]: obj[key] }
k++
} else if (k === 1) {
obj2 = { ...obj2, [key]: obj[key] }
k++
} else if (k === 2) {
obj3 = { ...obj3, [key]: obj[key] }
k = 0
}
}
return {
obj1,
obj2,
obj3
}
}