获取嵌套对象键作为连接字符串
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))
输入:
{
"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))