Группировка массивов Javascript - PullRequest
0 голосов
/ 06 октября 2018

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

      let array = [
        {el: 1, ready: true},
        {el: 2, ready: false},
        {el: 3, ready: false},
        {el: 4, ready: false},
        {el: 5, ready: true},
        {el: 6, ready: true},
        {el: 7, ready: false},
      ];

хочу отобразить как это

      let arrayGroup = [
        [
          {el: 1, ready: true},
        ],
        [
          {el: 2, ready: false},
          {el: 3, ready: false},
          {el: 4, ready: false}
        ],
        [
          {el: 5, ready: true},
          {el: 6, ready: true}
        ],
        [
          {el: 7, ready: false}
        ]
      ];

Ответы [ 4 ]

0 голосов
/ 07 октября 2018

let array = [
  {el: 1, ready: true},
  {el: 2, ready: false},
  {el: 3, ready: false},
  {el: 4, ready: false},
  {el: 5, ready: true},
  {el: 6, ready: true},
  {el: 7, ready: false},
];

let currentReadyStatus = array[0].ready;
finalArray = [[]];
currentIndex = 0;

array.forEach((item) => {
  if(item.ready === currentReadyStatus)
     finalArray[currentIndex].push(item);
  else{
    currentReadyStatus = !currentReadyStatus;
    currentIndex += 1;
    finalArray[currentIndex] = [item]
  }
})

console.log(finalArray)
0 голосов
/ 06 октября 2018

Это должно работать:

let array = [{
    el: 1,
    ready: true
  },
  {
    el: 2,
    ready: false
  },
  {
    el: 3,
    ready: false
  },
  {
    el: 4,
    ready: false
  },
  {
    el: 5,
    ready: true
  },
  {
    el: 6,
    ready: true
  },
  {
    el: 7,
    ready: false
  },
];

let previousArrValue = array[0].ready;
let newArrayBuilt = [];
let newArr = [];

for (let i = 0; i < array.length; i++) {


  if (array[i].ready !== previousArrValue) {
    newArrayBuilt.push(newArr);
    newArr = [];
  }


  previousArrValue = array[i].ready;
  newArr.push(array[i]);

  if (i + 1 === array.length) {
    newArrayBuilt.push(newArr);
    break;
  }


}

console.log(newArrayBuilt)
0 голосов
/ 06 октября 2018

В этой ситуации Array.reduce может быть полезным.Для каждого посещаемого объекта возвращается свойство ready, которое становится следующим аккумулятором.

  let starter = !array[0].ready;
  let new_arr = [];
  let new_index = -1;

  array.reduce((acc, cur, index, arr) => {
    if (acc != arr[index].ready)
    {
        new_arr.push([cur]);
        new_index++;
    }
    else
    {
        new_arr[new_index].push(cur);
    }

    return cur.ready;
  }, starter);

new_arr - это нужный вам массив.В этом случае требуется начальное значение (starter), чтобы функция reduce начиналась с создания нового подмассива.

0 голосов
/ 06 октября 2018

Вы можете следовать моему методу:

let array = [
        {el: 1, ready: true},
        {el: 2, ready: false},
        {el: 3, ready: false},
        {el: 4, ready: false},
        {el: 5, ready: true},
        {el: 6, ready: true},
        {el: 7, ready: false},
      ];
/*
      let arrayGroup = [
        [
          {el: 1, ready: true},
        ],
        [
          {el: 2, ready: false},
          {el: 3, ready: false},
          {el: 4, ready: false}
        ],
        [
          {el: 5, ready: true},
          {el: 6, ready: true}
        ],
        [
          {el: 7, ready: false}
        ]
      ];
*/
var arrayGroup = [];
array.forEach((current,index)=>{
  if(index===0){
    arrayGroup.push([{el:current.el, ready:current.ready}]);
  }else{
    //check previous group if same will add to there, or not same, will add to new 
    if(current.ready === array[index-1].ready){
      arrayGroup[arrayGroup.length-1].push({el:current.el, ready:current.ready});
    }else{
      arrayGroup.push([{el:current.el, ready:current.ready}]);
    };
  };
});
console.log(arrayGroup);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...