findPropPath【从对象中找到键名路径名】
描述
从对象中依次递归遍历出所有符合(属性)key === findField,键名路径名
比如一个对象是:
const user = { name: '张洪文', id: '1', list: [], obj: { id: '---', hos: { location: { name: '卫生院' } } }
要求获取到 其中的所有属性名为 name 访问过的路径,依次从顶部到当前, 得到
[ { "_pathList": [ "张洪文", "name" ], "_path": "张洪文|name", "_value": "张洪文" }, { "_pathList": [ "卫生院", "name" ], "_path": "卫生院|name", "_value": "卫生院" } ]
# 1.示例
import { findPropPath } from 'sf-utils2'
const user = {
name: '张洪文',
id: '1',
list: [],
obj: {
id: '---',
hos: {
location: {
name: '卫生院'
}
}
}
}
findPropPath({ data: user, findField: 'name' })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输出结果,点击查看
;[
{
_pathList: ['张洪文', 'name'], // 路径名 数组
_path: '张洪文|name', // 路径名
_value: '张洪文' // 找到属性对应的值
},
{
_pathList: ['卫生院', 'name'],
_path: '卫生院|name',
_value: '卫生院'
}
]
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2.入参说明
# 主入参
| 参数 | 说明 | 类型 | 是否必填 | 默认值 |
|---|---|---|---|---|
| data | 原数据 | Object | 是 | |
| findField | 要寻找的属性名 | String | 是 | name |
| props | 自定义属性名,详情见下 👇 | Object | 否 |
# props 对象
| 参数 | 说明 | 类型 | 是否必填 | 默认值 |
|---|---|---|---|---|
| key | 从上而下的路径键名,用于返回 | String | 否 | _path |
| value | 找到属性名的对应的属性值,用于返回 | String | 否 | _value |
# 3.源码
import setPropPath from './setPropPath'
import isPlainObject from '@/base/isPlainObject'
/**
* 根据findField 从对象中依次遍历出所有符合(属性)key === findField,路径
* @param {object} data 对象
* @param {string} findField 要查找的属性名
* @param {object} props 自定义属性名
* @returns {*[]}
*/
function findPropPath({ data = {}, findField = 'name', props = { key: '__path__', value: '__value__' } }) {
const _data = setPropPath({ data, field: props.key })
const cb = (data = _data, selfField = findField, result = []) => {
if (isPlainObject(data)) {
if (data.hasOwnProperty(selfField)) {
const value = {
[props.key]: (data[selfField] && data[selfField][props.key]) || '',
[props.value]: data[selfField]
}
if (!isPlainObject(data[selfField])) {
value[props.key] = data[selfField] + '|' + selfField
}
result.push(value)
}
Object.keys(data).forEach(key => {
cb(data[key], selfField, result)
})
}
return result || []
}
return cb()?.map(v => ({
__pathList__: v[props.key].split('|'),
...v
}))
}
export default findPropPath
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
上次更新: 2023/06/24, 19:35:48