繁体   English   中英

如果内部对象相同,javascript合并数组

[英]javascript merge array if the inside objects are same

任何人在线。 我需要帮助。 我有一个这样的数组。

var array = [ {
roomNumber: 'R01',
roomType: 'Deluxe',
basic_facilities: 'Hot Water',
additional_facilities: 'Iron' },
    {
roomNumber: 'R01',
roomType: 'Deluxe',
basic_facilities: 'Minibar',
additional_facilities: 'AC' },
    {
roomNumber: 'R01',
roomType: 'Deluxe',
basic_facilities: 'cold Water',
additional_facilities: 'Fan' },
    {
roomNumber: 'R02',
roomType: 'standerd',
basic_facilities: 'View',
additional_facilities: 'Washing' },
         {
roomNumber: 'R02',
roomType: 'standerd',
basic_facilities: 'View 2',
additional_facilities: 'wash' }
    ]

我想让它像这样。

var result =[{
roomNumber: 'R01',
roomType: 'Deluxe',
basic_facilities: ['Hot Water','Minibar','cold Water'],
additional_facilities: ['Iron','AC','fan'] },{
roomNumber: 'R02',
roomType: 'standerd',
basic_facilities: ['View','View 2'],
additional_facilities: ['Washing','wash'] }]

我知道这是一个基本的东西。 但我需要这方面的帮助。 谢谢。

这就是我迄今为止所做的。

 var array = [ { roomNumber: 'R01', roomType: 'Deluxe', basic_facilities: 'Hot Water', additional_facilities: 'Iron' }, { roomNumber: 'R01', roomType: 'Deluxe', basic_facilities: 'Minibar', additional_facilities: 'AC' }, { roomNumber: 'R01', roomType: 'Deluxe', basic_facilities: 'cold Water', additional_facilities: 'Fan' }, { roomNumber: 'R02', roomType: 'standerd', basic_facilities: 'View', additional_facilities: 'Washing' }, { roomNumber: 'R02', roomType: 'standerd', basic_facilities: 'View 2', additional_facilities: 'wash' } ] result = []; array.forEach(function (a) { if (!this[a.roomNumber]) { this[a.roomNumber] = { roomNumber: a.roomNumber}; result.push(this[a.roomNumber]); } }, Object.create(null)); console.log(result);

看起来您正在尝试在迭代时将项目组合成一个对象,这是正确的想法,但用于执行此操作的方法是reduce :回调的第一个参数将是上次迭代返回的值(或者,在第一次迭代时,初始值 - 传递给.reduce的第二个参数)。

在每次迭代中,如果累加器(第一个参数)上尚不存在roomNumber则在roomNumber处创建一个对象 - 然后,推送到该对象中的basic_facilitiesadditional_facilities数组。 最后,使用Object.values将对象转换为其值的数组:

 var array = [{ roomNumber: 'R01', roomType: 'Deluxe', basic_facilities: 'Hot Water', additional_facilities: 'Iron' }, { roomNumber: 'R01', roomType: 'Deluxe', basic_facilities: 'Minibar', additional_facilities: 'AC' }, { roomNumber: 'R01', roomType: 'Deluxe', basic_facilities: 'cold Water', additional_facilities: 'Fan' }, { roomNumber: 'R02', roomType: 'standerd', basic_facilities: 'View', additional_facilities: 'Washing' }, { roomNumber: 'R02', roomType: 'standerd', basic_facilities: 'View 2', additional_facilities: 'wash' } ]; const roomsByRoomNumber = array.reduce((a, item) => { const { roomNumber, roomType, basic_facilities, additional_facilities } = item; if (!a[roomNumber]) { a[roomNumber] = { roomNumber, roomType, basic_facilities: [], additional_facilities: [] }; } a[roomNumber].basic_facilities.push(basic_facilities); a[roomNumber].additional_facilities.push(additional_facilities); return a; }, {}); const result = Object.values(roomsByRoomNumber); console.log(result);

似乎您想组合roomNumber,roomType的基础数组。您可以使用reduce()findIndex()来实现这一点。

 var arr = [ {roomNumber: 'R01',roomType: 'Deluxe',basic_facilities: 'Hot Water',additional_facilities:'Iron' }, {roomNumber: 'R01',roomType: 'Deluxe',basic_facilities: 'Minibar',additional_facilities: 'AC' }, {roomNumber: 'R01',roomType: 'Deluxe',basic_facilities: 'cold Water',additional_facilities: 'Fan' }, {roomNumber: 'R02',roomType: 'standerd',basic_facilities: 'View',additional_facilities: 'Washing' }, {roomNumber: 'R02',roomType: 'standerd',basic_facilities: 'View 2',additional_facilities: 'wash' } ] let mkeys = ['roomNumber','roomType'] let ckeys = ['basic_facilities','additional_facilities'] let result = arr.reduce((ac,a) => { let ind = ac.findIndex(x => mkeys.every(key => x[key] === a[key])); a = JSON.parse(JSON.stringify(a)); ckeys.forEach(key => a[key] = [a[key]]); ind === -1 ? ac.push(a) : ckeys.forEach(key => ac[ind][key].push(a[key][0])); return ac; },[]) console.log(result);

只是另一个解决方案......

...
const result = [];
for (const room of array) {
  const processedRoom = result.find(r => r.roomNumber == room.roomNumber);
  if (processedRoom) {
     processedRoom.basic_facilities.concat(room.basic_facilities);
     processedRoom.additional_facilities.concat(room.additional_facilities);
  } else {
     result.push(room);
  }
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM