уменьшить массив объектов во вложенные массивы - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь вкладывать элементы друг в друга, но сегодня у меня пердит мозг.

Если элемент в массиве isParent: true, то он создаст новый массив в существующем массиве, и все последующие элементы будут вложены в этот массив.

Вот что я пробовал до сих пор:

//input [{},{},{},{isParent}, {}, {}, {isParent}, {}, {}]
//desired output [{}, {}, {}, [{}, {}, {}, [{}, {}, {}]]]

var nestInParent = elements => {
      let ignoreIndexAfter = null;
      return elements.reduce((acc, { component, isParent }, index) => {
        if (isParent) {
          let remaining = elements.slice(index + 1);
   			ignoreIndexAfter = index;
          if (remaining.length > 0) {
            return [...acc, [component, ...nestInParent(remaining)]];
          } else {
            return [...acc, [component]];
          }
        } else {
			if(ignoreIndexAfter === null || index < ignoreIndexAfter){
               return [...acc, component];
            }
return acc;
        }
      }, []);
    };
const isParent = true;
const input = [
  {component:0},
  {component:1},
  {component:2},
  {isParent, component:3},
  {component:4},
  {component:5},
  {isParent, component:6},
  {component:7},
  {component:8}
];
const expected = [
  0,
  1,
  2,
  [
    3,
    4,
    5,
    [
      6,
      7,
      8
    ]
  ]
];
const output = nestInParent(input);
console.log("input:", input);
console.log("output:", output);
console.log("passes?", JSON.stringify(output) === JSON.stringify(expected));
.as-console-wrapper { max-height: 100% !important; }

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Я бы сказал, что ваш код не работает, потому что он слишком сложен. Вам просто нужно:

const result = [];
let current = result;

 for(const { component, isParent } of data) {
   if(isParent) {
     current.push(current = [component]);
   } else current.push(component);
 }

const input = [
  {component:0},
  {component:1},
  {component:2},
  {isParent: true, component:3},
  {component:4},
  {component:5},
  {isParent: true, component:6},
  {component:7},
  {component:8}
];

const result = [];
let current = result;

 for(const { component, isParent } of input) {
   if(isParent) {
     current.push(current = [component]);
   } else current.push(component);
 }

console.log(result);

Или, если вы действительно хотите уменьшить, уменьшите право:

const result = data.reduceRight((acc, { isParent, component }) => isParent ? [[component, ...acc]] : [component, ...acc], []);

const input = [
  {component:0},
  {component:1},
  {component:2},
  {isParent: true, component:3},
  {component:4},
  {component:5},
  {isParent: true, component:6},
  {component:7},
  {component:8}
];

const result = input.reduceRight((acc, { isParent, component }) =>
isParent ? [[component, ...acc]] : [component, ...acc], []);

console.log(result);
2 голосов
/ 02 мая 2019

Вы также можете сделать это, используя метод reduce и одну переменную, чтобы отслеживать, если найден элемент с isParent prop.

const isParent = true;
const input = [{component:0},{component:1},{component:2},{isParent, component:3},{component:4},{component:5},{isParent, component:6},{component:7},{component:8}];

function nest(data) {
  let nested = false;
  return data.reduce((r, e, i) => {
    if(!nested) {
    	if(e.isParent) {
      	const res = nest(data.slice(i + 1))
        r.push([e.component, ...res])
        nested = true;
      } else {
        r.push(e.component)
      }
    }
    return r;
  }, [])
}

const result = nest(input);
console.log(result)

Вы также можете написать это так.

const isParent = true;
const input = [{ component: 0 }, { component: 1 }, { component: 2 }, { isParent, component: 3 }, { component: 4 }, { component: 5 },{ isParent, component: 6 }, { component: 7 }, { component: 8 }];

function nest(data, nested) {
  return data.reduce((r, e, i) => {
    if(!nested) {
      if(e.isParent && i != 0) {
        r.push(nest(data.slice(i)))
        nested = true;
      } else {
        r.push(e.component)
      }
    }
    return r;
  }, [])
}

const result = nest(input);
console.log(result)
...