Как посчитать уникальное значение из объекта массива в JavaScript - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу вычислить количество уникальных значений и поместить их в новый массив. У меня ниже массива:

[
  { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
  { CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
  { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]

Я хочу новый массив с приведенным ниже результатом:

[
    { CategoryId: "b5c3f43f941c", count: 2, CategoryColor: "cgreen" }
    { CategoryId: "9872cce5af92", count: 1, CategoryColor: "purple" }
]

В этой проверке по идентификатору, если идентификатор совпадает с количеством выставок и новым в новом массиве.

Надеюсь, ты понимаешь, чего я хочу.

Спасибо

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Вы можете отсортировать массив, а затем подсчитать дубликаты. Недостатком является то, что он изменит исходный yourArray из-за сортировки, поэтому используйте его с осторожностью.

yourArray.sort((a, b) => {
  if (a.CategoryName > b.CategoryName) {
    return 1;
  }
  if (a.CategoryName < b.CategoryName) {
    return -1;
  }
  return 0;
});

var pivot = yourArray[0];
pivot.count = 0;
var counted = [pivot];
yourArray.forEach(item => {
  if (item.CategoryId === pivot.CategoryId) {
    pivot.count++;
  } else {
    pivot = item;
    pivot.count = 1;
    counted.push(pivot);
  }
});
0 голосов
/ 13 ноября 2018

Вы можете перебрать массив, используя «for..of», и создать временный объект для сохранения данных в каждом цикле.Если такой же идентификатор существует в tempObject, то счетчик приращений увеличивается на 1

var arr = [
  { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
  , { CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
  , { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]

var tempResult = {}

for(let { CategoryColor, CategoryId } of arr)
  tempResult[CategoryId] = { 
      CategoryId, 
      CategoryColor, 
      count: tempResult[CategoryId] ? tempResult[CategoryId].count + 1 : 1
  }      

let result = Object.values(tempResult)

console.log(result)
0 голосов
/ 13 ноября 2018
const array_unique = require('array-hyper-unique').array_unique

let arr = [
  { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
  { CategoryId: "9872cce5af92", CategoryName: "Category 2", CategoryColor: "purple" }
  { CategoryId: "b5c3f43f941c", CategoryName: "Category 1", CategoryColor: "cgreen" }
]

array_unique(arr).length
0 голосов
/ 13 ноября 2018

Используйте функцию reduce и внутри проверки обратного вызова существует объект, которому соответствует CategoryId.Если совпадения, то обновите счетчик или создайте новый объект со значениями и вставьте массив

let k = [{
    CategoryId: "b5c3f43f941c",
    CategoryName: "Category 1",
    CategoryColor: "cgreen"
  },
  {
    CategoryId: "9872cce5af92",
    CategoryName: "Category 2",
    CategoryColor: "purple"
  },
  {
    CategoryId: "b5c3f43f941c",
    CategoryName: "Category 1",
    CategoryColor: "cgreen"
  }
]

let result = k.reduce(function(acc, curr) {
  // Check if there exist an object in empty array whose CategoryId matches
  let isElemExist = acc.findIndex(function(item) {
    return item.CategoryId === curr.CategoryId;
  })
  if (isElemExist === -1) {
    let obj = {};
    obj.CategoryId = curr.CategoryId;
    obj.count = 1;
    obj.CategoryColor = curr.CategoryColor;
    acc.push(obj)
  } else {
    acc[isElemExist].count += 1
  }
  return acc;

}, [])

console.log(result)
...