Функциональный способ построения массива массивов в JavaScript - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть строка, которая является путем к значению во вложенном объекте 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 / ramda функции для достижения того же результата.

Ответы [ 4 ]

0 голосов
/ 18 декабря 2018

Вы можете использовать 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);
0 голосов
/ 18 декабря 2018

Вы можете использовать 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);
0 голосов
/ 18 декабря 2018

Вы можете сделать это следующим образом

Разделить строку с помощью ., а затем, отображая ее, мы соединяем элементы массива temp в соответствии с индексом.

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);
0 голосов
/ 18 декабря 2018

Вы можете использовать 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);
...