2017-01-05 8 views
1

Вот мой Array.Слияние массивов с одинаковым идентификатором

Я хочу объединить массивы, имеющие тот же _id, т. Е. 86ded3fdfc5f92724491f82 Как я могу это сделать? Я делаю так, чтобы создать массив.

dinnerDrug.push({ 
    '_id': value._id, 
    'name': value.medicine_name, 
    'count': value.dose_dinner_count, 
    'type': value.medicine_type, 
    'consume': value.dose_dinner_consume, 
    'comment': value.medicine_comment 
}); 

dinnerArray.push({ 
    '_id': value.doctor_id, 
    'doctor_name': value.doctor_name, 
    'doctor_dept': 'Cardiologist', 
    'prescription': dinnerDrug 
}); 

Я попытался удалить dupliate как этот

morningArray.forEach(function(val) { 
    if (val._id == value.doctor_id) { 
     morningArray.prescription.push(morningDrug) 
    } else { 
      morningArray.push({ 
      '_id': value.doctor_id, 
      'doctor_name': value.doctor_name, 
      'doctor_dept': 'Cardiologist', 
      'prescription': morningDrug 
     }); 
    } 
}); 

Но дубликат массива не удаляется, а он говорит, что ошибка в толчке не определен. Какую ошибку я делаю и как я могу это исправить?

Ожидаемый результат должен быть таким:

{ 
    "_id": "586ded3fdfc5f92724491f82", 
    "doctor_name": "asd asd", 
    "doctor_dept": "Cardiologist", 
    "prescription": [ 
     { 
      "_id": "586dfdbe98c23d1a200cfb3f", 
      "name": "ALPHACAINE N, solution injectable à usage dentaire", 
      "count": "1", 
      "type": "0", 
      "consume": "0", 
      "comment": "test" 
     }, 
     { 
      "_id": "586dfda498c23d1a200cfb3b", 
      "name": "ALPHACAINE N, solution injectable à usage dentaire", 
      "count": "1", 
      "type": "0", 
      "consume": "0", 
      "comment": "test" 
     } 
    ] 
} 

Примечание: Я хочу сделать это только в JavaScript

+1

Это может помочь: http://codereview.stackexchange.com/questions/60128/removing-duplicates-from-an-array-quickly – Rajesh

+0

Когда ты проверьте наличие дубликатов, думаю, эта строка 'morningArray.prescription.push (morningDrug)' должна быть 'val.prescription.push (morningDrug)'. 'morningArray' не имеет никакого свойства' prescription', не так ли? –

+0

Я тоже это пробовал .. 'val.prescription.push (morningDrug)' stil, который делает массив пустым –

ответ

1

Вы можете использовать хэш-таблицу для _id и проверить, если объект с хэш существует. Если не сделать новый хеш с фактическим элементом, в противном случае добавить перкты к объекту хеш-таблицы и сплайсировать массив.

var data = { success: "1", prescription_data: [{ _id: "586c95a4ce997012a44f777c", doctor_name: "new doctor", doctor_dept: "Cardiologist", prescription: [{ _id: "586c9f48fa0e603670cb01ae", name: "ASCOFER 33 mg, gélule", count: "1", type: "0", consume: "0", comment: "asdfd" }] }, { _id: "586ded3fdfc5f92724491f82", doctor_name: "asd asd", doctor_dept: "Cardiologist", prescription: [{ _id: "586dfda498c23d1a200cfb3b", name: "ALPHACAINE N, solution injectable à usage dentaire", count: "1", type: "0", consume: "0", comment: "test" }] }, { _id: "586ded3fdfc5f92724491f82", doctor_name: "asd asd", doctor_dept: "Cardiologist", prescription: [{ _id: "586dfdbe98c23d1a200cfb3f", name: "ALPHACAINE N, solution injectable à usage dentaire", count: "1", type: "0", consume: "0", comment: "test" }] }] }, 
 
    hash = Object.create(null), 
 
    i = 0; 
 

 
while (i < data.prescription_data.length) { 
 
    if (hash[data.prescription_data[i]._id]) { 
 
     hash[data.prescription_data[i]._id].prescription = hash[data.prescription_data[i]._id].prescription.concat(data.prescription_data[i].prescription); 
 
     data.prescription_data.splice(i, 1); 
 
     continue; 
 
    } 
 
    hash[data.prescription_data[i]._id] = data.prescription_data[i]; 
 
    i++; 
 
} 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Позвольте мне попробовать то же самое сейчас –

1

Сокращение prescription_data на объект карты с уникальными _id ключами, затем возвращаются значения этого объекта.

var data = {"success":"1","prescription_data":[{"_id":"586c95a4ce997012a44f777c","doctor_name":"new doctor","doctor_dept":"Cardiologist","prescription":[{"_id":"586c9f48fa0e603670cb01ae","name":"ASCOFER 33 mg, gélule","count":"1","type":"0","consume":"0","comment":"asdfd"}]},{"_id":"586ded3fdfc5f92724491f82","doctor_name":"asd asd","doctor_dept":"Cardiologist","prescription":[{"_id":"586dfda498c23d1a200cfb3b","name":"ALPHACAINE N, solution injectable à usage dentaire","count":"1","type":"0","consume":"0","comment":"test"}]},{"_id":"586ded3fdfc5f92724491f82","doctor_name":"asd asd","doctor_dept":"Cardiologist","prescription":[{"_id":"586dfdbe98c23d1a200cfb3f","name":"ALPHACAINE N, solution injectable à usage dentaire","count":"1","type":"0","consume":"0","comment":"test"}]}]}; 
 

 
data.prescription_data = Object.values(data.prescription_data.reduce(function (aggr, item) { 
 
    if(aggr[item._id]){ 
 
     aggr[item._id].prescription = aggr[item._id].prescription.concat(item.prescription); 
 
    } else { 
 
     aggr[item._id] = item; 
 
    } 
 
    return aggr; 
 
},{})); 
 

 
console.log(data);

1

Я предлагаю чистое и простое решение. Проблема в том, что Array.indexOf не будет работать с объектами, поэтому для метода «фильтр» есть небольшой помощник, который использует поле «_id» как идентификатор объекта лекарственного средства. работы с ECMAScript 5.

var srcObj = {"success":"1","prescription_data":[{"_id":"586c95a4ce997012a44f777c","doctor_name":"new doctor","doctor_dept":"Cardiologist","prescription":[{"_id":"586c9f48fa0e603670cb01ae","name":"ASCOFER 33 mg, gélule","count":"1","type":"0","consume":"0","comment":"asdfd"}]},{"_id":"586ded3fdfc5f92724491f82","doctor_name":"asd asd","doctor_dept":"Cardiologist","prescription":[{"_id":"586dfda498c23d1a200cfb3b","name":"ALPHACAINE N, solution injectable à usage dentaire","count":"1","type":"0","consume":"0","comment":"test"}]},{"_id":"586ded3fdfc5f92724491f82","doctor_name":"asd asd","doctor_dept":"Cardiologist","prescription":[{"_id":"586dfdbe98c23d1a200cfb3f","name":"ALPHACAINE N, solution injectable à usage dentaire","count":"1","type":"0","consume":"0","comment":"test"}]}]}; 
 

 
var indexOfId = function(arr, obj){ 
 
    for(var objIdx in arr){ 
 
     if(arr[objIdx]._id === obj._id) return objIdx; 
 
    } 
 
} 
 

 
srcObj.prescription_data = srcObj.prescription_data.filter((o, i, a) => indexOfId(a, o) == i); 
 

 
console.log(srcObj);

 Смежные вопросы

  • Нет связанных вопросов^_^