Сгруппируйте массив по значению поля и поместите сгруппированные значения в массив - PullRequest
0 голосов
/ 13 июня 2019

У меня есть массив:

let docArray = [ 
    { documentID: 304717110, doublettenID: 111, done: true },
  { documentID: 304717110, doublettenID: 222, done: true },
  { documentID: 304717110, doublettenID: 333, done: true },
  { documentID: 304717110, doublettenID: 444, done: true },
  { documentID: 304717110, doublettenID: 555, done: true },
  { documentID: 304717110, doublettenID: 666, done: true },
  { documentID: 304862280, doublettenID: null, done: true },
  { documentID: 304862281, doublettenID: null, done: true },
  { documentID: 304933685, doublettenID: null, done: true },
  { documentID: 304933871, doublettenID: null, done: true },
  { documentID: 304933870, doublettenID: null, done: true },
  { documentID: 304862282, doublettenID: null, done: true } 
  ]

Я бы хотел сгруппировать по documentID, создать Object для каждого отдельного documentID и вставить значения поля «doublettenID» в массив для каждого объекта. Как я могу легко это сделать?

Ответы [ 3 ]

1 голос
/ 13 июня 2019

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

let docArray = [ 
    { documentID: 304717110, doublettenID: 111, done: true },
  { documentID: 304717110, doublettenID: 222, done: true },
  { documentID: 304717110, doublettenID: 333, done: true },
  { documentID: 304717110, doublettenID: 444, done: true },
  { documentID: 304717110, doublettenID: 555, done: true },
  { documentID: 304717110, doublettenID: 666, done: true },
  { documentID: 304862280, doublettenID: null, done: true },
  { documentID: 304862281, doublettenID: null, done: true },
  { documentID: 304933685, doublettenID: null, done: true },
  { documentID: 304933871, doublettenID: null, done: true },
  { documentID: 304933870, doublettenID: null, done: true },
  { documentID: 304862282, doublettenID: null, done: true } 
  ]
  
  var ids = []
  var res = []
  
  docArray.forEach(doc => {   
    if (!ids.includes(doc.documentID)) {
    	doc.doublettenID = [doc.doublettenID]
  		res.push(doc)
      ids.push(doc.documentID)
    } else {
    	res.find(d => doc.documentID = d.documentID).doublettenID.push(doc.doublettenID)
    }
 })
  
console.log(res)
1 голос
/ 13 июня 2019

Я бы посоветовал вам использовать функцию Array # Reduce.В моем понимании это выглядит очень читабельным.

let docArray = [{
    documentID: 304717110,
    doublettenID: 111,
    done: true
  },
  {
    documentID: 304717110,
    doublettenID: 222,
    done: true
  },
  {
    documentID: 304717110,
    doublettenID: 333,
    done: true
  },
  {
    documentID: 304717110,
    doublettenID: 444,
    done: true
  },
  {
    documentID: 304717110,
    doublettenID: 555,
    done: true
  },
  {
    documentID: 304717110,
    doublettenID: 666,
    done: true
  },
  {
    documentID: 304862280,
    doublettenID: null,
    done: true
  },
  {
    documentID: 304862281,
    doublettenID: null,
    done: true
  },
  {
    documentID: 304933685,
    doublettenID: null,
    done: true
  },
  {
    documentID: 304933871,
    doublettenID: null,
    done: true
  },
  {
    documentID: 304933870,
    doublettenID: null,
    done: true
  },
  {
    documentID: 304862282,
    doublettenID: null,
    done: true
  }
];

const ar = docArray.reduce((a, c) => {
  debugger;
  let filtered = a.filter(el => el.documentID === c.documentID);
  if (filtered.length > 0) {
    a[a.indexOf(filtered[0])].doublettenID.push(c.doublettenID);
  } else {
    if (c.doublettenID !== null) {
      let originalValue = c.doublettenID;
      c.doublettenID = [];
      c.doublettenID.push(originalValue);
    }

    a.push(c);
  }
  return a;
}, []);

$('#pre').text(JSON.stringify(ar));

1 голос
/ 13 июня 2019

Вы можете пройти через него и использовать documentID в качестве ключа, и нажать на отдельный объект.

let docArray = [ 
  { documentID: 304717110, doublettenID: 111, done: true },
  { documentID: 304717110, doublettenID: 222, done: true },
  { documentID: 304717110, doublettenID: 333, done: true },
  { documentID: 304717110, doublettenID: 444, done: true },
  { documentID: 304717110, doublettenID: 555, done: true },
  { documentID: 304717110, doublettenID: 666, done: true },
  { documentID: 304862280, doublettenID: null, done: true },
  { documentID: 304862281, doublettenID: null, done: true },
  { documentID: 304933685, doublettenID: null, done: true },
  { documentID: 304933871, doublettenID: null, done: true },
  { documentID: 304933870, doublettenID: null, done: true },
  { documentID: 304862282, doublettenID: null, done: true } 
];
let groups = {};

docArray.forEach(entry => {
    if (!groups.hasOwnProperty(entry.documentID)) {
	groups[entry.documentID] = [];
    }

    groups[entry.documentID].push(entry.doublettenID);
});

console.log(groups);
...