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

У меня есть такой объект:

data.bills = [
    { date: '2018-01-20', amount: '220', category: 'Electricity' ,categoryId: '48' },
    { date: '2018-01-20', amount: '20', category: 'Gas' ,categoryId: '16' },
    { date: '2018-02-20', amount: '120', category: 'Electricity' ,categoryId: '48' }
]

Теперь я хочу создать новый массив из этого, как это (Req Output):

data.allUniqueCategories = [
    {category: 'Electricity' ,categoryId: '48'},
    { category: 'Gas' ,categoryId: '16'}
]

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

function _toConsumableArray(arr) { 
    if (Array.isArray(arr)) { 
        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
        arr2[i] = arr[i]; } 
        return arr2; 
        } else {
    return Array.from(arr); } 
}

c.data.categories = [].concat(_toConsumableArray(new Set(data.bills.map(function (bill) {
    return bill.state;
}))));

console.log(c.data.categories);
//['Electricity','Gas']

но я хочу в этом формате

//[{category: 'Electricity' ,categoryId: '48'},{ category: 'Gas' ,categoryId: '16'}]

Ответы [ 4 ]

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

Используйте Array#reduce() для создания объекта с категориями в качестве ключей и получения значений этого объекта как результата

const bills = [
    { date: '2018-01-20', amount: '220', category: 'Electricity' ,categoryId: '48' },
    { date: '2018-01-20', amount: '20', category: 'Gas' ,categoryId: '16' },
    { date: '2018-02-20', amount: '120', category: 'Electricity' ,categoryId: '48' }
]

const res = Object.values(bills.reduce((a,{category,categoryId})=>{
   a[category]={category, categoryId}
   return a;
},{}))

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

Вы можете уменьшить bills в объект с категорией в качестве ключа, а затем преобразовать в массив, используя Object.values():

const bills = [{"date":"2018-01-20","amount":"220","category":"Electricity","categoryId":"48"},{"date":"2018-01-20","amount":"20","category":"Gas","categoryId":"16"},{"date":"2018-02-20","amount":"120","category":"Electricity","categoryId":"48"}]

const allUniqueCategories = Object.values(bills.reduce((r, { category, categoryId }) => {
  r[category] = { category, categoryId };

  return r;
}, {}));

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

Вы можете использовать метод reduce с Map в качестве параметра аккумулятора для создания уникального массива с помощью category и categoryId реквизитов.

const bills = [
  { date: '2018-01-20', amount: '220', category: 'Electricity' ,categoryId: '48' },
  { date: '2018-01-20', amount: '20', category: 'Gas' ,categoryId: '16' },
  { date: '2018-02-20', amount: '120', category: 'Electricity' ,categoryId: '48' }
]

const uniq = bills.reduce((r, {category, categoryId}) => {
  let key = `${category}|${categoryId}`;
  r.set(key, (r.get(key) || {category, categoryId}));
  return r;
}, new Map())

console.log([...uniq.values()])
0 голосов
/ 21 октября 2018
data.bills = [
    { date: '2018-01-20', amount: '220', category: 'Electricity' ,categoryId: '48' },
    { date: '2018-01-20', amount: '20', category: 'Gas' ,categoryId: '16' },
    { date: '2018-02-20', amount: '120', category: 'Electricity' ,categoryId: '48' }
]
data.allUniqueCategories = [...new Set(data.bills.map(o => o.category));

Здесь map получает категории и добавляет к новому Set, Set может содержать только уникальные значения, поэтому, если будут повторяющиеся категории, он не будет добавлен в Set после завершения map это будет распространять Set значения в новый массив этим оператором ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...