Удаление дубликатов ключей из массива объектов - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть массив таких объектов

let array = [
  {
    sector: "adad"
  },
  {
    sector: "adadasdsd"
  },
  {
    sector: "sdsdsd"
  },
  {
    origin: "sdfsf"
  },
  {
    destination: "dfsfsdf"
  }
];

Я хочу, чтобы это было так:

let array = [
  { sector: ["adad", "adadasdsd", "sdsdsd"] },
  { origin: ["sdfsf"] },
  { destination: ["dfsfsdf"] }
];

Дайте мне знать, как этого можно достичь.Я знаю, что сокращение поможет мне.Однако я застрял на том, как действовать дальше?Любая помощь?

Ответы [ 6 ]

0 голосов
/ 10 декабря 2018

Если вы используете Array.reduce и Map в качестве аккумулятора, вы можете решить это несколько лаконично:

let array = [{ sector: "adad" }, { sector: "adadasdsd" }, { sector: "sdsdsd" }, { origin: "sdfsf" }, { destination: "dfsfsdf" } ];

const result = array.reduce((m, c, i, a) => {
  Object.keys(c).forEach(key => m.set(key, [...(m.get(key)||[]), c[key]]))
  return i == a.length - 1 ? Array.from(m, ([k,v]) => ({[k]: v}))  : m
}, new Map())

console.log(result)
0 голосов
/ 10 декабря 2018

Вот один из способов сделать это:

let array =   [
  {
    "sector": "adad"
  },
  {
    "sector": "adadasdsd"
  },
  {
    "sector": "sdsdsd"
  },
  {
    "origin": "sdfsf"
  },
  {
    "destination": "dfsfsdf"
  }
]

let res = [];
array.map(item=>{
  let key = Object.keys(item)[0], value = item[key],
      objRes = res.filter(r=>r[key]);  
  if (objRes.length == 0) {
      let obj = {};
      obj[key] = [value];
      res.push(obj);
  } else 
      objRes[0][key].push(value);
});

console.log(res);
0 голосов
/ 10 декабря 2018

Общее решение с использованием Array.prototype.reduce () :

let array =   [{"sector": "adad"},{"sector": "adadasdsd"},{"sector": "sdsdsd"},{"origin": "sdfsf"},{"destination":"dfsfsdf"}]

let reduced = array.reduce((a, c, i) => {
  let key = Object.keys(c)[0];
  if (!(key in a)) a[key] = [];
  if (!a[key].includes(c[key])) a[key].push(c[key]);
  return a;
}, {})

console.log(reduced)
0 голосов
/ 10 декабря 2018

Вы можете взять хеш-таблицу для сбора значений одних и тех же ключей и отобразить их позже на пары «ключ-значение».

let array = [{ sector: "adad" }, { sector: "adadasdsd" }, { sector: "sdsdsd" }, { origin: "sdfsf" }, { destination: "dfsfsdf" }],
    grouped = Object
        .entries(array.reduce(
            (r, o) => (
                Object.entries(o).forEach(([k, v]) => (r[k] = r[k] || []).push(v)),
                r
            ),
            Object.create(null)
        ))
        .map(([k, v]) => ({ [k]: v }));
   
console.log(grouped);
0 голосов
/ 10 декабря 2018

Ванильный раствор с редуктором:

let array =   [
  {
    "sector": "adad"
  },
  {
    "sector": "adadasdsd"
  },
  {
    "sector": "sdsdsd"
  },
  {
    "origin": "sdfsf"
  },
  {
    "destination": "dfsfsdf"
  }
]

let rearranged = array.reduce((acc, entry) => {
  if (entry.sector) { acc[0].sector.push(entry.sector); }
  else if (entry.origin) { acc[1].origin.push(entry.origin); }
  else { acc[2].destination.push(entry.destination); }
  return acc;
}, [{sector: []}, {origin: []}, {destination: []}]);

console.log(rearranged);
0 голосов
/ 10 декабря 2018

вы можете попробовать с JQuery

let array2 = {
        sector: [],
        origin: [],
        destination: []
    }


$.each(array, function (_index, value) {
    if (value.sector != null)
        array2.sector.push(value.sector)
    if (value.origin != null)
        array2.origin.push(value.origin)
    if (value.destination != null)
        array2.destination.push(value.destination)
})
...