我有一个字符串,它是嵌套JavaScript对象中值的路径,例如:
users.userA.credentials.name
我想将此字符串拆分为元素,然后创建一个包含所有“子路径”的数组,如下所示:
["users", "users.userA", "users.userA.credentials"]
目前,我正在通过以下方式解决此问题:
const path = "users.userA.credentials.name"
const currentPath = []
const paths = []
for (const item of path.split('.')) {
currentPath.push(item)
paths.push([...currentPath])
}
它工作正常,但我想知道是否有更实用的方法(使用map()
,filter()
,reduce()
或某些lodash
/ {{1 }}函数以达到相同的结果。
答案 0 :(得分:3)
您可以使用Array.split()
和Array.map()
以更实用的方式进行操作:
const path = "users.userA.credentials.name"
const paths = path.split('.')
.map((_, i, arr) => arr.slice(0, i + 1).join('.'));
console.log(paths);
答案 1 :(得分:0)
您可以使用reduce
遍历子字符串并推送到累加器数组,并检查累加器的先前值(如果有的话)并将其与新的子字符串连接:
const path = "users.userA.credentials.name";
const splitPaths = path.split('.');
const initialValue = splitPaths.shift();
const paths = splitPaths.reduce((a, item, i) => {
a.push(`${a[i]}.${item}`);
return a;
}, [initialValue]);
console.log(paths);
答案 2 :(得分:0)
您可以这样做
用.
分割字符串,然后通过映射将其映射为索引。
let str = "users.userA.credentials.name";
let temp = str.split('.');
let op = temp.map((e,i)=> temp.slice(0,i+1).join('.'));
console.log(op);
如果您对使用正则表达式感兴趣,可以这样做
let str = "users.userA.credentials.name";
let temp = [];
let op = str.replace(/\.|$/g,(_,offset)=>{
temp.push(str.substr(0,offset));
return _;
})
console.log(temp);
答案 3 :(得分:0)
您可以使用array#reduce
。在.
上分割路径,然后在累加器数组中加入.
后推入子数组。
const path = "users.userA.credentials.name",
result = path.split('.').reduce((r, p, i, a) => {
if(i)
r.push(a.slice(0,i).join('.'));
return r;
}, []);
console.log(result);