Группировать или суммировать массив Javascript - PullRequest
0 голосов
/ 04 мая 2018
var json =
[
   {
      id: 11,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:1
   },
   {
      id: 12,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:2
   },
   {
      id: 13,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:3
   },
   {
      id: 14,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:1
   },
   {
      id: 15,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:2
   },
   {
      id: 16,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:1
   },
   {
      id: 17,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:2
   },
      id: 18,
      name:"app3",
      family:"utils",
      caseID: 150,
      order:null
   }
  ] 

Здравствуйте, я хотел бы отсортировать массив выше по ключу высшего порядка и вернуть отфильтрованный массив ниже. Общий ключ - это caseID. Кроме того, если ключ заказа нулевой, верните его. Я искал и тестировал некоторые функции и циклы, но, похоже, не могу получить его обряд. Любая помощь будет высоко ценится. Я бы предпочел es2015, если это возможно. Спасибо!

filtered = 
 [

  {
      id: 13,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:3  
   },
   {
      id: 15,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:2
   },
   {
      id: 17,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:2
   },
   {
      id: 18,
      name:"app3",
      family:"utils",
      caseID: 150,
      order:null
   }
  ]

Ответы [ 7 ]

0 голосов
/ 04 мая 2018

Это должно помочь вам отфильтровать массив объектов.

            var filteredMap = {};
            json.forEach(function (item) {
                filteredMap[item.caseID] = item;
            });
            var filteredArray = [];
            for (var key in filteredMap) {
                filteredArray.push(filteredMap[key]);
            }
            console.log(JSON.stringify(filteredArray));
0 голосов
/ 04 мая 2018

Сортировка по порядку и caseID, а затем фильтрация по caseID. Вот код:

var json =
[
   {
      id: 11,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:1
   },
   {
      id: 12,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:2
   },
   {
      id: 13,
      name:"app1",
      family:"apps",
      caseID: 123,
      order:3
   },
   {
      id: 14,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:1
   },
   {
      id: 15,
      name:"app2",
      family:"tools",
      caseID: 129,
      order:2
   },
   {
      id: 16,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:1
   },
   {
      id: 17,
      name:"app3",
      family:"utils",
      caseID: 120,
      order:2
   }, {
      id: 18,
      name:"app3",
      family:"utils",
      caseID: 150,
      order:null
   }
 ]
var obj = {}
var arr = json.sort(function(a, b) {
  return b.order - a.order
}).sort(function(a, b) {
  return a.caseId - b.caseId
}).filter(function(item, index, array){
  return obj.hasOwnProperty(item.caseID) ? false : (obj[item.caseID] = true)
})
console.log(arr)

демо: http://jsbin.com/qabehorike/edit?js,console,output

0 голосов
/ 04 мая 2018

Вы можете использовать caseID хеш-таблицу и переопределить результаты, которые вы найдете позже, если order выше:

  const result = [], hash = {};

  for(const el in json) {
   const exists = hash[el.caseId];
   if(exists) {
     if(el.order > exists.order)
       Object.assign(exists, el);
   } else {
       result.push(hash[el.caseId] = {...el});
   }
 }
0 голосов
/ 04 мая 2018

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

Затем используйте Object.values(object) для создания массива значений из объекта

var json = [{
    "id": 11,
    "name": "app1",
    "family": "apps",
    "caseID": 123,
    "order": 1
  },
  {
    "id": 12,
    "name": "app1",
    "family": "apps",
    "caseID": 123,
    "order": 2
  },
  {
    "id": 13,
    "name": "app1",
    "family": "apps",
    "caseID": 123,
    "order": 3
  },
  {
    "id": 14,
    "name": "app2",
    "family": "tools",
    "caseID": 129,
    "order": 1
  },
  {
    "id": 15,
    "name": "app2",
    "family": "tools",
    "caseID": 129,
    "order": 2
  },
  {
    "id": 16,
    "name": "app3",
    "family": "utils",
    "caseID": 120,
    "order": 1
  },
  {
    "id": 17,
    "name": "app3",
    "family": "utils",
    "caseID": 120,
    "order": 2
  }, {
    "id": 18,
    "name": "app3",
    "family": "utils",
    "caseID": 150,
    "order": null
  }
]

var m = json.reduce(function(acc, curr, index) {
  if (acc[curr['caseID']] === undefined) {
    acc[curr['caseID']] = curr;

  } else {
    if (acc[curr['caseID']].order < curr.order) {
      acc[curr['caseID']] = curr;
    }
  }
  return acc;
}, {})
console.log(Object.values(m))
0 голосов
/ 04 мая 2018

В ES6:

json.sort((a, b) => a.caseID > b.caseID);
let bad_order = json.filter(v => v.order === null);
let good_order = json.filter(v => v.order !== null);

Пример

В ES5:

json.sort(function(a, b) { return a.caseID > b.caseID; });

var bad_order = [];
var good_order = [];

for(var i = 0; i < json.length; i++){
  if(json[i].order === null)
    bad_order.push(json[i]);
  else
    good_order.push(json[i]);
}

Пример

0 голосов
/ 04 мая 2018

Я бы начал с избавления от обманщиков. Вы можете сделать это с помощью reduce() и присвоить объекту с ключом caseID. Вы можете одновременно избегать любого объекта с меньшим order, чем тот, который вы уже видели. Затем вы можете взять значения этого хэша, которые будут уникальными объектами на основе caseID, и отсортировать их, как обычно. Например:

var json = [{   "id": 11,   "name":"app1",   "family":"apps",   "caseID": 123,   "order":1},{   "id": 12,   "name":"app1",   "family":"apps",   "caseID": 123,   "order":2},{   "id": 13,   "name":"app1",   "family":"apps",   "caseID": 123,   "order":3},{   "id": 14,   "name":"app2",   "family":"tools",   "caseID": 129,   "order":1},{   "id": 15,   "name":"app2",   "family":"tools",   "caseID": 129,   "order":2},{   "id": 16,   "name":"app3",   "family":"utils",   "caseID": 120,   "order":1},{   "id": 17,   "name":"app3",   "family":"utils",   "caseID": 120,   "order":2},{   "id": 18,   "name":"app3",   "family":"utils",   "caseID": 150,   "order":null},] 

// get just the filtered items based on caseID
// picking out only the largest
let filtered = json.reduce((a,c) => {
      if (!a[c.caseID] || a[c.caseID]['order'] < c.order) a[c.caseID] = c
      return a
  }, {})

// basic sort
let result = Object.values(filtered).sort((a,b) => b.order - a.order)
console.log(result)
0 голосов
/ 04 мая 2018

Вы можете попробовать следующее

Метод

  1. Создание объекта с уникальным идентификатором дела в качестве ключа, а значение - это элемент с наивысшим порядком
  2. Сортировка по заказу

// Code goes here

var json = [{"id":11,"name":"app1","family":"apps","caseID":123,"order":1},{"id":12,"name":"app1","family":"apps","caseID":123,"order":2},{"id":13,"name":"app1","family":"apps","caseID":123,"order":3},{"id":14,"name":"app2","family":"tools","caseID":129,"order":1},{"id":15,"name":"app2","family":"tools","caseID":129,"order":2},{"id":16,"name":"app3","family":"utils","caseID":120,"order":1},{"id":17,"name":"app3","family":"utils","caseID":120,"order":2},{"id":18,"name":"app3","family":"utils","caseID":150,"order":null}];
  
  
  var map = {};

  // Create a map of unique case ID's with highest order
  json.forEach((item) => {
    if(map[item.caseID]) {
        if(map[item.caseID].order < item.order) {
          map[item.caseID] = item;
        }
    } else {
      map[item.caseID] = item;
    }
  });
  
  // Sorting the array based on order
  var result = Object.values(map).sort((a,b) => b.order-a.order);
  console.log(result);
  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...