如何解决删除数组内JSON平面对象中的前两个字符
我有这个带有1个对象的JSON平面数组:
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)
我需要删除对象每个元素的前两个字符。
例如,这个:
"0.id": 1,
需要成为这个:
"id": 1,"details.first_name": "Gary","details.last_name": "Ortiz",
有人对如何执行此操作有想法吗?我已经尝试了拼接和映射,但是它们不起作用,因为它是对象而不是数组。
解决方法
如果您知道数组只有一个元素,则不需要flatten
函数,您可以仅获取第一个也是唯一的元素。然后,使用修改后的键将值分配给新对象:
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);
,
- 使用
Object.entries
,可以从每个对象生成[键,值]对。 - 使用
Array.reduce
,可以生成从键中获取2个字符的结果对象。
const input = [ { "0.id": 1,"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);
,
您可以根据值构建对象或数组。
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,"2.vip": true }],result = data.reduce((r,o) => {
Object.entries(o).forEach(([k,v]) => setValue(r,v));
return r;
},[]);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
,
要获取元素数组,您可以像这样操作:
let final = []
Object.keys(data).forEach(key => {
let firstDot = key.indexOf('.')
let id = key.substring(0,firstDot);
if(!final[id]){
final.push({})
}
final[id][key.substring(firstDot + 1)] = data[key]
})
console.log(final)
运行:https://jsbin.com/libevevanu/edit?js,console
,您不能直接删除json的前2个字符,因为它们将是重复的键(例如:"0.id": 1,
和"1.id": 2,
)
但是,这是一个更改此对象的小脚本:
{
"0.id": 1,"0.vip": false
"1.id": 2,"1.vip": false
"2.id": 3,"2.vip": true
}
进入这个:
[
{
"id": 1,"details.first_name": "Gary","details.last_name": "Ortiz","details.nicknames.0.language": "italian","details.nicknames.0.value": "martello","details.nicknames.1.language": "inglese","details.nicknames.1.value": "hammer","details.email.0": "gortiz0@mapy.cz","details.email.1": "awilliamson1@narod.ru","country": "Indonesia","modified": "2015-05-16","vip": false
},{
"id": 2,"details.first_name": "Carl","details.last_name": "Jones","details.nicknames.0.language": "danish","details.nicknames.0.value": "wefwgge","details.nicknames.1.language": "Doich","details.nicknames.1.value": "egwrgerge","details.email.0": "erkhoej@google.net","details.email.1": "peeeeeeeeeeweqw@fb.ru","country": "Taiwan","modified": "2325-05-16","1.vip": false
},{
"id": 3,"details.first_name": "Michael","details.last_name": "Smith","details.nicknames.0.language": "Portoguese","details.nicknames.0.value": "wdqppppd","details.nicknames.1.language": "Russian","details.nicknames.1.value": "hamfwewdqqmer","details.email.0": "dcwrverg3@iissq.fr","details.email.1": "vvnvncmmxm@dqwdq.com","country": "Japan","modified": "1235-44-44","vip": true
}
]
脚本:
const yourObject = {...};
const subObjects = {};
for (const key in yourObject) {
const [indice,...subKey] = key.split('.');
if (!indice in subObjects) {
subObjects[indice] = {};
}
subObject[indice][subKey.join('.')] = yourObject[key];
}
// I assume you don't skip a number in your initial object
// -> If there is "3.",then there are "0.","1." and "2."
const array = [];
for (let indice=0; indice<Object.keys(subObjects).length; indice++) {
array.push(subObject[indice]);
};
console.log(array); // <- Your list of sub objects
,
尝试一下:
const yourJson = [
{
"0.id": 1,"2.vip": true
}
]
const result = Object.keys(js[0]).reduce((acc,key) => {
acc[key.slice(2)] = js[0][key];
return acc;
},{});
注意:如果删除前两个字符,则最终列表将是原始列表的1/3。
随着"0.id"
,"1.id"
和"2.id"
都将变为"id"
。其他键也一样。
在这种情况下,子字符串是定时炸弹。试试吧!
const jsonFile = [{ "0.id": 1,"2.vip": true }]
var output = {}
var mObj = jsonFile[0]
var mKeys = Object.keys(mObj)
for (const key of mKeys) {
let splited = key.split(".")
let x = splited.shift()
output[x] = output[x] || {}
output[x][splited.join(".")] = mObj[key]
}
console.log(Object.values(output));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。