获取嵌套对象键作为连接字符串

Get nested objects key as joined string

输入:

{
  "mobile": "Mob # Required",
  "client": [
    undefined,
    null,
    {
      "usergroup": "Required"
    },
    {
      "id": "Required",
      "usergroup": "Required"
    },
    {
      "id": "Required",
      "usergroup": "Required"
    }
  ]
}

预期输出:

[
    "mobile", 
    "client.2.usergroup", 
    "client.3.id", 
    "client.3.usergroup", 
    "client.4.id", 
    "client.4.usergroup"
]

我在我的项目中使用 Formiks FieldArray,错误对象中的字段名称不是预期的。 Object.Keys() 在这种情况下效果不佳。

我敢肯定有图书馆可以为你做这件事,但这是我想出的:

function flattenNestedObject(input, path) {
  path = path || [];

  return Object.keys(input).reduce(function(arr, key) {
    if (input[key] && typeof input[key] === "object") {
      return arr.concat(flattenNestedObject(input[key], path.concat(key)));
    }

    if (typeof input[key] !== 'undefined' && input[key] !== null) {
      return arr.concat((path.concat(key).join(".")));
    }

    return arr;
  }, []);
}

https://codesandbox.io/s/sweet-jang-j51dh

Object.keys 对您不起作用的原因是它不会递归地获取对象的所有键。此外,在您的预期输出中,如果对象包含嵌套的数组或对象,您不需要该对象的所有键。

您可以flatMap 对象的键。如果当前键的值是一个对象,则使用更新后的前缀递归调用 getKeys 函数。如果不是,return 具有给定前缀的当前密钥。使用 flatMap 获取扁平的键数组而不是嵌套数组

const input={mobile:"Mob # Required",client:[{usergroup:"Required"},{id:"Required",usergroup:"Required"},{id:"Required",usergroup:"Required"}]};

const getKeys = (o, prefix = '') =>
  Object.keys(o).flatMap(k =>
    Object(o[k]) === o[k] ? getKeys(o[k], `${prefix}${k}.`) : [prefix + k]
  )

console.log(getKeys(input))

如果不支持flatMap,可以reduce类似逻辑的对象的key

const input={mobile:"Mob # Required",client:[{usergroup:"Required"},{id:"Required",usergroup:"Required"},{id:"Required",usergroup:"Required"}]};

function getKeys(o, prefix = '') {
  return Object.keys(o).reduce((acc, k) => {
    if (Object(o[k]) === o[k])
      acc.push(...getKeys(o[k], `${prefix}${k}.`))
    else
      acc.push(prefix + k)
    return acc;
  }, [])
}

console.log(getKeys(input))