#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);