Отсортировать массив по имени статусу и вывести кол-во

Есть массив типа:

[
{"Name1" "Status1"},
{"Name1" "Status1"},
{"Name1" "Status2"},
{"Name2" "Status1"},
{"Name2" "Status2"},
]

Нужно отсортировать его так, что бы выдавало кол-во имя и статус одинаковых элементов

Вот так:

2 х Name1 Status1
1 x Name1 Status2
1 x Name2 Status1
1 x Name2 Status2

Использую Javascript, так же думаю это можно с помощью ramda реализовать вроде.

Как написать сортировку?


Ответы (2 шт):

Автор решения: Aziz Umarov

Ну так как я вижу попытки решения

  1. Создайте другой массив который будет хранить ваш результат.
  2. В цикле пробегаетесь по исходному и добавляете в результирующий, если такового нет, иначе инкремент количество на совпадении.
  3. Сортируйте результирующий массив и выводить результат.

Ответ да в JavaScript это можно сделать.

→ Ссылка
Автор решения: Михаил Камахин

Не думаю, что вы что-то поймёте, я думаю, вам нужно самим это написать

function identicalArrays(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }
  for (let i = 0; i < arr1.length; i++) {
    if (typeof arr1[i] === 'object' ||
      typeof arr1[i] === 'boolean' ||
      typeof arr1[i] === 'symbol' ||
      typeof arr1[i] === 'function' ||
      typeof arr1[i] === 'undefined') {
      return false;
    }
  }
  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i].toString() !== arr2[i].toString()) {
      return false
    }
  }
  return true;
}

function mySort(arr) {

  const findArr = [];
  for (let i = 0; i < arr.length; i++) {
    const item = arr[i];
    if (!Array.isArray(item)) {
      continue;
    }
    let copyName = false;
    for (let j = 0; j < findArr.length; j++) {
      const item1 = findArr[j];
      if (identicalArrays(item1.arr, item)) {
        copyName = true;
        item1.size++;
      }
    }
    if (!copyName) {
      pushInFindArr();
    }

    function pushInFindArr() {
      findArr.push({
        arr: item,
        size: 1
      });
    }
  }

  return findArr;

}

function printArr(sortArray) {
  let result = '';
  sortArray.forEach(item => {
    let name = '';
    for (let j = 0; j < item.arr.length; j++) {
      const item1 = item.arr[j];
      name += ` ${item1}`;
    }
    const str = item.size + ' x ' + name;
    // console.log(str);
    result += str + '<br>';
  });
  const div = document.createElement('div');
  div.innerHTML = result;
  document.body.append(div);
}

const arr = [
  ["Name1", "Status1"],
  ["Name1", "Status1"],
  ["Name1", "Status2"],
  ["Name2", "Status1"],
  ["Name2", "Status2"]
];
const sortArray = mySort(arr);
printArr(sortArray);

→ Ссылка