我有以下 JSON。
var a = {
"0": "123",
"1": 'gio',
"again": "blabla",
"ah" : "fff",
"ss" : {
"0": "444",
"1": "555",
"final": "letssee"
}
}
我想得到以下一个
var a = {
"again": "blabla",
"ah" : "fff",
"ss" : {
"final": "letssee"
}
}
这个想法是我们递归地遍历整个对象并删除所有数字键。对象可以越来越深,所以我们需要递归。
我试图想出一个代码,但不知何故我的解决方案是巨大的,而且非常丑陋。
我很欣赏 ES6 的方式(干净且简单)...
答案 0 :(得分:1)
const isObj = (x) => x !== null && typeof x === "object" && !Array.isArray(x);
const removeNumericKeys = (o) =>
Object.fromEntries(
Object.entries(o).flatMap(([k, v]) =>
isNaN(Number(k)) ? [[k, isObj(v) ? removeNumericKeys(v) : v]] : []
)
);
答案 1 :(得分:1)
基本上,您可以使用递归使用 for ... in
进行循环,并使用 parseInt
和 isNaN
检查对象的键以检查它是否为数字。
这是一种破坏性的实现方式,如果你看,它会改变主要对象。
let obj = {
"0": "123",
"1": 'gio',
"again": "blabla",
"ah": "fff",
"ss": {
"0": "444",
"1": "555",
"final": "letssee"
}
}
function deleteRecursive(obj) {
for (let k in obj) {
const parsedKey = parseInt(k);
// if it is NOT NAN it means it is numeric, so we delete it
if (!isNaN(parsedKey)) {
delete obj[k];
} else if (typeof obj[k] == "object" && obj[k] !== null) {
deleteRecursive(obj[k]);
}
}
}
deleteRecursive(obj);
console.log(obj)
如果您想保留旧对象并将其分配给新对象,这是另一种方法。
let obj = {
"0": "123",
"1": 'gio',
"again": "blabla",
"ah": "fff",
"ss": {
"0": "444",
"1": "555",
"final": "letssee"
}
}
let newObj = {}
function deleteRecursive(obj, newObj) {
for (let k in obj) {
const parsedKey = parseInt(k);
// if it is NOT NAN it means it is numeric, so we dont add it
if (typeof obj[k] == "object" && obj[k] !== null) {
newObj[k] = {}
deleteRecursive(obj[k], newObj[k]);
} else if (isNaN(parsedKey)) {
newObj[k] = obj[k]
}
}
}
deleteRecursive(obj, newObj);
console.log(newObj)