Как объединить объекты с одинаковыми ключами?

#javascript #typescript

Вопрос:

У меня есть ответ JSON, поступающий от узла.JS API, где значения меток одинаковы, но другие значения, такие как dd1, dd2, отличаются. Я пытаюсь объединить одни и те же значения меток в одном объекте, как я мог этого достичь?

 {  "label": "Medium",   "dd1": "Cat A",   "dd2": "Non Cision",    },  {  "label": "Medium",  "dd1": "Cat B",  "dd2": null,    },  {  "label": "Tone",   "dd1": "Neutral",   "dd2": null,    }  

Над объектами JSON мы видим, что метки одинаковы в первых двух, поэтому они должны быть объединены, а нулевые значения удалены. подобный этому

 {  "label": "Medium",   "dd1": "Cat A", "Cat B"   "dd2": "Non Cision",    },   {  "label": "Tone",   "dd1": "Neutral",   "dd2": null,    }  

Код TS —

 var output = [];  value.forEach(function(item) {  var existing = output.filter(function(v, i) {  return v.label == item.label;  });  if (!existing.length) {  if (typeof item.label == "string") output.push(item);  }  });   console.log(output);  

Комментарии:

1. Вы говорите, что записи с одной и той же меткой должны объединяться, но способ, которым вы показываете слияние, неверен. Вы ожидаете, что строки будут объединены или будет создан массив. т. е. должно "dd1": "Cat A", "Cat B" быть "dd1": "Cat A,Cat B" или "dd1": ["Cat A", "Cat B"] ?

2. Да, записи с одной и той же меткой должны объединяться, и это должно быть похоже "dd1": "Cat A", "Cat B"

3. Однако это неверная структура.

4. если это может быть так "dd1": ["Cat A", "Cat B"] , это также будет полезно

Ответ №1:

Вы можете это проверить?

 const cars = [  {  "label": "Medium",  "dd1": "Cat A",  "dd2": "Non Cision",   },  {  "label": "Medium",  "dd1": "Cat B",  "dd2": null,   },  {  "label": "Tone",  "dd1": "Neutral",  "dd2": null,   } ];  function groupBy(objectArray, property) {  return objectArray.reduce(function (acc, obj) {  let key = obj[property]  if (!acc[key]) {  acc[key] = []  }  acc[key].push(obj)  return acc  }, {}) }  function sum(a, c) {  if (a amp;amp; c) {  return a   ', '   c  } else if (a) {  return a  } else if (c) {  return c  } else {  return null  } }  let object = groupBy(cars, 'label') let arr = [];  for (const property in object) {  arr.push({  property,  dd1: object[property].map(o =gt; o.dd1).reduce((a, c) =gt; { return sum(a, c) }),  dd2: object[property].map(o =gt; o.dd2).reduce((a, c) =gt; { return sum(a, c) })  }) }   console.log(arr); 

Ответ №2:

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

 const data = [  { "label": "Medium", "dd1": "Cat A", "dd2": "Non Cision" },  { "label": "Medium", "dd1": "Cat B", "dd2": null },  { "label": "Medium", "dd1": "Cat C", "dd2": null },  { "label": "Tone", "dd1": "Neutral", "dd2": null }, ];  const merge_value = (key, current_value, new_value) =gt;  (key === 'label' || !current_value) ? new_value :  !new_value ? current_value :  [].concat(current_value, new_value);  const merge_objects = (object1, object2) =gt;  Object.entries(object2).reduce(  (acc, [key, value]) =gt; Object.assign(acc, { [key]: merge_value(key, object1[key], value) }),  {}  );  const mapped = data.reduce(  (acc, item) =gt; acc.set(item.label, merge_objects(acc.get(item.label) ?? {}, item)),  new Map() );  const res = [...mapped.values()];  console.log(res);