在JavaScript中构建数组数组的功能方法

时间:2018-12-18 07:36:07

标签: javascript functional-programming lodash

我有一个字符串,它是嵌套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 }}函数以达到相同的结果。

4 个答案:

答案 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);