Лодаш получит листья из смешанных массивов и объектов

1

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

[
  {
    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, потому что он идеально подходит для операций с массивами/объектами. Спасибо за помощь заранее.

  • 0
    что-то не так в вашем примере вывода и в вашем описании ниже этого вывода, например, ваш ввод не содержит строку onemorekink (но ваш вывод содержит)
  • 0
    Глубокие извинения, исправление!
Показать ещё 1 комментарий
Теги:
object
arrays
lodash

3 ответа

1
Лучший ответ

Попробуй это

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
    Так просто, OMG. Большое спасибо!
1

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

function process(data){
        for(let a of data){
            if(a.subCats){
                process(a.subCats);
            }else{
                console.log(a)
            }
        }
    }
1

Довольно просто написать метод, который сделает это за вас без необходимости в 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');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню