我有一个JSON平面数组,里面有一个对象:
null
const jsonFile = [ { "0.id": 1, "0.details.first_name": "Gary", "0.details.last_name": "Ortiz", "0.details.nicknames.0.language": "italian", "0.details.nicknames.0.value": "martello", "0.details.nicknames.1.language": "inglese", "0.details.nicknames.1.value": "hammer", "0.details.email.0": "gortiz0@mapy.cz", "0.details.email.1": "awilliamson1@narod.ru", "0.country": "Indonesia", "0.modified": "2015-05-16", "0.vip": false, "1.id": 2, "1.details.first_name": "Carl", "1.details.last_name": "Jones", "1.details.nicknames.0.language": "danish", "1.details.nicknames.0.value": "wefwgge", "1.details.nicknames.1.language": "Doich", "1.details.nicknames.1.value": "egwrgerge", "1.details.email.0": "erkhoej@google.net", "1.details.email.1": "peeeeeeeeeeweqw@fb.ru", "1.country": "Taiwan", "1.modified": "2325-05-16", "1.vip": false, "2.id": 3, "2.details.first_name": "Michael", "2.details.last_name": "Smith", "2.details.nicknames.0.language": "Portoguese", "2.details.nicknames.0.value": "wdqppppd", "2.details.nicknames.1.language": "Russian", "2.details.nicknames.1.value": "hamfwewdqqmer", "2.details.email.0": "dcwrverg3@iissq.fr", "2.details.email.1": "vvnvncmmxm@dqwdq.com", "2.country": "Japan", "2.modified": "1235-44-44", "2.vip": true } ]
// I've flatted this object using this function:
JSON.flatten = function(data) {
var result = {};
function recurse (cur, prop) {
if (Object(cur) !== cur) {
result[prop] = cur;
} else if (Array.isArray(cur)) {
for(var i=0, l=cur.length; i<l; i++)
recurse(cur[i], prop ? prop+""+i : ""+i);
if (l == 0)
result[prop] = [];
} else {
var isEmpty = true;
for (var p in cur) {
isEmpty = false;
recurse(cur[p], prop ? prop+""+p : p);
}
if (isEmpty)
result[prop] = {};
}
}
recurse(data, "");
return result;
}
let finalFlat = JSON.flatten(jsonFile)
console.log(finalFlat)
null
问题是:我需要取消对象的每个元素的前两个字符。例如,这个:
"0.id": 1,
"0.details.first_name": "Gary",
"0.details.last_name": "Ortiz",
需要变成这样:
"id": 1,
"details.first_name": "Gary",
"details.last_name": "Ortiz",
有人知道怎么做吗?我试过splice和map,但它们都不起作用,因为它是一个对象而不是数组。
object.entries
,可以从每个对象生成[key,value]对。Array.Reduce
,您可以生成从键中提取2个字符的结果对象。null
const input = [ { "0.id": 1, "0.details.first_name": "Gary", "0.details.last_name": "Ortiz", "0.details.nicknames.0.language": "italian", "0.details.nicknames.0.value": "martello", "0.details.nicknames.1.language": "inglese", "0.details.nicknames.1.value": "hammer", "0.details.email.0": "gortiz0@mapy.cz", "0.details.email.1": "awilliamson1@narod.ru", "0.country": "Indonesia", "0.modified": "2015-05-16", "0.vip": false, "1.id": 2, "1.details.first_name": "Carl", "1.details.last_name": "Jones", "1.details.nicknames.0.language": "danish", "1.details.nicknames.0.value": "wefwgge", "1.details.nicknames.1.language": "Doich", "1.details.nicknames.1.value": "egwrgerge", "1.details.email.0": "erkhoej@google.net", "1.details.email.1": "peeeeeeeeeeweqw@fb.ru", "1.country": "Taiwan", "1.modified": "2325-05-16", "1.vip": false, "2.id": 3, "2.details.first_name": "Michael", "2.details.last_name": "Smith", "2.details.nicknames.0.language": "Portoguese", "2.details.nicknames.0.value": "wdqppppd", "2.details.nicknames.1.language": "Russian", "2.details.nicknames.1.value": "hamfwewdqqmer", "2.details.email.0": "dcwrverg3@iissq.fr", "2.details.email.1": "vvnvncmmxm@dqwdq.com", "2.country": "Japan", "2.modified": "1235-44-44", "2.vip": true } ]
const result = input.map((item) => (Object.entries(item).reduce((acc, cur) => {
const indexKey = cur[0].substring(0, 2);
if (!acc[indexKey]) { acc[indexKey] = {}; }
acc[indexKey][cur[0].substring(2)] = cur[1];
return acc;
}, {}))).map((item) => Object.values(item)).flat();
console.log(result);
如果知道数组只有一个元素,则不需要flatten
函数,只需取第一个也是唯一一个元素即可。然后将这些值分配给具有修改后键的新对象:
null
var data = [
{
"0.id": 1,
"0.details.first_name": "Gary",
"0.details.last_name": "Ortiz"
}
];
var dataObject = data[0];
var result = {};
Object.entries(dataObject).forEach(entry => {
var [key, value] = entry;
var newKey = key.substring(2);
result[newKey] = value;
});
console.log(result);
您可以根据值构建对象或数组。
null
const
setValue = (object, path, value) => {
let keys = path.split('.'),
last = keys.pop();
keys
.reduce((o, k, i, kk) =>
o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}), object)
[last] = value;
},
data = [{ "0.id": 1, "0.details.first_name": "Gary", "0.details.last_name": "Ortiz", "0.details.nicknames.0.language": "italian", "0.details.nicknames.0.value": "martello", "0.details.nicknames.1.language": "inglese", "0.details.nicknames.1.value": "hammer", "0.details.email.0": "gortiz0@mapy.cz", "0.details.email.1": "awilliamson1@narod.ru", "0.country": "Indonesia", "0.modified": "2015-05-16", "0.vip": false, "1.id": 2, "1.details.first_name": "Carl", "1.details.last_name": "Jones", "1.details.nicknames.0.language": "danish", "1.details.nicknames.0.value": "wefwgge", "1.details.nicknames.1.language": "Doich", "1.details.nicknames.1.value": "egwrgerge", "1.details.email.0": "erkhoej@google.net", "1.details.email.1": "peeeeeeeeeeweqw@fb.ru", "1.country": "Taiwan", "1.modified": "2325-05-16", "1.vip": false, "2.id": 3, "2.details.first_name": "Michael", "2.details.last_name": "Smith", "2.details.nicknames.0.language": "Portoguese", "2.details.nicknames.0.value": "wdqppppd", "2.details.nicknames.1.language": "Russian", "2.details.nicknames.1.value": "hamfwewdqqmer", "2.details.email.0": "dcwrverg3@iissq.fr", "2.details.email.1": "vvnvncmmxm@dqwdq.com", "2.country": "Japan", "2.modified": "1235-44-44", "2.vip": true }],
result = data.reduce((r, o) => {
Object.entries(o).forEach(([k, v]) => setValue(r, k, v));
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }