Упорядочить массив данных в матричный порядок в Javascript - PullRequest
0 голосов
/ 16 октября 2018

Я не могу найти логику. Здесь мне нужно упорядочить приведенные ниже данные в многомерный с матричным форматом,

var data = [
        {
            "matrixData":[8,0],
            "x":8,
            "y":0,
        }, 
        {
            "matrixData":[0,4],
            "x":0,
            "y":4,
        }, 
        {
            "matrixData":[4,0],
            "x":4,
            "y":0,
        },
        {
            "matrixData":[0,0],
            "x":0,
            "y":0,
        }, 
        {
            "matrixData":[4,4],
            "x":4,
            "y":4
        }
    ]

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

var data = [
        [
            {
                "matrixData":[0,0],
                "x":0,
                "y":0,
            },
            {
                "matrixData":[4,0],
                "x":4,
                "y":0,
            },
            {
                "matrixData":[8,0],
                "x":8,
                "y":0,
            },
        ],
        [
            {
                "matrixData":[0,4],
                "x":0,
                "y":4,
            }, 
            {
                "matrixData":[4,4],
                "x":4,
                "y":4
            }
        ]        
    ]

здесь x - строка, а y - столбец, возможно ли это с помощью метода сортировки или underscore.js

Ответы [ 2 ]

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

Источник JavaScript |Группировка объектов

var data = [
  {
    "matrixData":[8,0],
    "x":8,
    "y":0,
  }, 
  {
    "matrixData":[0,4],
    "x":0,
    "y":4,
  }, 
  {
    "matrixData":[4,0],
    "x":4,
    "y":0,
  },
  {
    "matrixData":[0,0],
    "x":0,
    "y":0,
  }, 
  {
    "matrixData":[4,4],
    "x":4,
    "y":4
  }
];
function groupBy(collection, property) {
  var i = 0, val, index,
      values = [], result = [];
  for (; i < collection.length; i++) {
    val = collection[i][property];
    index = values.indexOf(val);
    if (index > -1)
      result[index].push(collection[i]);
    else {
      values.push(val);
      result.push([collection[i]]);
    }
  }
  return result;
}

var obj = groupBy(data, "y");

console.log(obj);
0 голосов
/ 16 октября 2018

Вы можете отсортировать массив заранее, а затем сгруппировать объекты.

var data = [{ matrixData: [8, 0], x: 8, y: 0 }, { matrixData: [0, 4], x: 0, y: 4 }, { matrixData: [4, 0], x: 4, y: 0 }, { matrixData: [0, 0], x: 0, y: 0 }, { matrixData: [4, 4], x: 4, y: 4 }],
    groups = data
        .sort(({ matrixData: a }, { matrixData: b }) => a[1] - b[1] || a[0] - b[0])
        .reduce((r, o, i, a) => {
            if (!i || a[i - 1].matrixData[1] !== o.matrixData[1]) {
                r.push([o]);
            } else{
                r[r.length - 1].push(o);
            }        
            return r;
        }, [])
        
console.log(groups);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...