递归地从对象中删除编号的键

时间:2021-03-29 16:34:23

标签: javascript object ecmascript-6

我有以下 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 的方式(干净且简单)...

2 个答案:

答案 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 进行循环,并使用 parseIntisNaN 检查对象的键以检查它是否为数字。

这是一种破坏性的实现方式,如果你看,它会改变主要对象。

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)

相关问题