如果它们具有相同的ID,我想合并数组中的值

时间:2019-07-29 11:39:09

标签: javascript

我有一个具有相同ID和不同值的对象数组。我需要一个具有相同ID和不同值合并到ID的输出。

输入:

let data = [{
    id: 1,
    value: 'Honda'
  },
  {
    id: 2,
    value: 'Fiat'
  },
  {
    id: 2,
    value: 'Porche'
  },
  {
    id: 1,
    value: 'Benz'
  }
];

输出:

result = [{
      id: 1,
      value: ['Honda', 'Benz']
    }, {
      id: 2,
      value: ['Fiat', 'Porche']
    }

3 个答案:

答案 0 :(得分:1)

希望它会对您有所帮助。但是这个问题是重复的

let data = [{
    id: 1,
    value: 'Honda'
  },
  {
    id: 2,
    value: 'Fiat'
  },
  {
    id: 2,
    value: 'Porche'
  },
  {
    id: 1,
    value: 'Benz'
  }
];

var output = [];

data.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.id == item.id;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    output[existingIndex].value = output[existingIndex].value.concat(item.value);
  } else {
    if (typeof item.value == 'string')
      item.value = [item.value];
    output.push(item);
  }
});

console.dir(output);

答案 1 :(得分:1)

const data = [{
    id: 1,
    value: 'Honda'
  },
  {
    id: 2,
    value: 'Fiat'
  },
  {
    id: 2,
    value: 'Porche'
  },
  {
    id: 1,
    value: 'Benz'
  }
];

const expectedResult = [{
      id: 1,
      value: ['Honda', 'Benz']
    }, {
      id: 2,
      value: ['Fiat', 'Porche']
    }
 ];
 
 const result = [];
 data.forEach((e, i) => {
    const indexOfExisting = result.findIndex(x => x.id === e.id);
    if (indexOfExisting === -1) {
      result.push({
          id: e.id,
          value: [e.value]
      })
    } else {
      result[indexOfExisting].value.push(e.value);
    }
 });
 
 // console.log(result)
 console.log(expectedResult)

答案 2 :(得分:1)

您可以使用Array.prototype.reduce()来实现。

let data = [{
    id: 1,
    value: 'Honda'
  },
  {
    id: 2,
    value: 'Fiat'
  },
  {
    id: 2,
    value: 'Porche'
  },
  {
    id: 1,
    value: 'Benz'
  }
];


let result = data.reduce((acc, ele) => {

  let filtered = acc.filter(el => el.id == ele.id)
  if (filtered.length > 0) {

    filtered[0]["value"].push(ele.value);

  } else {
    element = {};
    element["id"] = ele.id;
    element["value"] = []
    element["value"].push(ele.value);
    acc.push(element)

  }

  return acc;
}, [])
console.log(result)