Лодаш получит листья из смешанных массивов и объектов - PullRequest
0 голосов
/ 11 января 2019

Позвольте мне сначала показать вам код, а затем я объясню свои потребности. Я хочу показать вам структуру входного массива и желаемый результат:

[
  {
    link: "someurl",
    name: "Foo",
    subCats: [
      {
        link: "anotherurl",
        name: "Bar",
        subCats: [
          {
            link: "anotherurl",
            subCats: [
              {
                link: "onemorekink"
                name: "Prod",
              }
            ]
          }
        ]
      },
      {
        link: "someurll",
        name: "Fuzzy",
        subCats: [
          {
            link: "besturiever",
            name: "SomeName",
            subCats: [
              {
                link: "onemore",
                name: "Aloc",
                subCats: [
                  {
                    link: "anotherlink"
                    name: "Final",
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

А что мне нужно получить в результате:

{
  link: "onemorekink"
  name: "Prod",
},
{
  link: "anotherlink"
  name: "Final",
}

Я надеюсь, вы поняли идею. По сути, мне нужно каким-то образом получить последний элемент subCats, в который не входит дочерний элемент subCats, и добавить его к полученному массиву. Я пытался использовать Lodash, потому что он идеально подходит для операций с массивами / объектами. Заранее спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Попробуйте это

let b=[]; // result here
let f = x => x.map( y=> y.subCats ? f(y.subCats) : b.push(y) );
f(a);

let a = [
  {
    link: "someurl",
    name: "Foo",
    subCats: [
      {
        link: "anotherurl",
        name: "Bar",
        subCats: [
          {
            link: "anotherurl",
            subCats: [
              {
                link: "onemorekink",
                name: "Prod",
              }
            ]
          }
        ]
      },
      {
        link: "someurll",
        name: "Fuzzy",
        subCats: [
          {
            link: "besturiever",
            name: "SomeName",
            subCats: [
              {
                link: "onemore",
                name: "Aloc",
                subCats: [
                  {
                    link: "anotherlink",
                    name: "Final",
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
];

let b=[];
let f = x => x.map( y=> y.subCats ? f(y.subCats) : b.push(y) );
f(a);

console.log(b);
0 голосов
/ 11 января 2019

довольно прямолинейно, без лишнего шума. рекурсивная функция ..

function process(data){
        for(let a of data){
            if(a.subCats){
                process(a.subCats);
            }else{
                console.log(a)
            }
        }
    }
0 голосов
/ 11 января 2019

Довольно просто написать метод, который сделает это за вас без необходимости в lodash

function findLastLeafs(items, key) {
  let results = [];
  items.forEach((item, index) => {
    if (item[key] && item[key].length) {
      results = results.concat(findLastLeafs(item[key], key));
    } else if (index === items.length - 1) {
      results.push(item);
    }
  })
  return results;
}

const result = findLastLeafs(data, 'subCats');
...