[英]javascript merge array if the inside objects are same
anyone online.任何人在线。 I need a help.
我需要帮助。 i have an array like this.
我有一个这样的数组。
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' }
]
i want to make it like this.我想让它像这样。
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'] }]
I know this is a basic stuff.我知道这是一个基本的东西。 But i need a help with this.
但我需要这方面的帮助。 Thanks.
谢谢。
this is what i have done so far.这就是我迄今为止所做的。
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);
It looks like you're trying to combine the items into an object while iterating, which is the right idea, but the method to use to do that is reduce
: the first argument to the callback will be the value returned from the last iteration (or, on the first iteration, the initial value - the second argument passed to .reduce
).看起来您正在尝试在迭代时将项目组合成一个对象,这是正确的想法,但用于执行此操作的方法是
reduce
:回调的第一个参数将是上次迭代返回的值(或者,在第一次迭代时,初始值 - 传递给.reduce
的第二个参数)。
On each iteration, create an object at the roomNumber
if it doesn't exist on the accumulator (the first argument) yet - then, push to the basic_facilities
and additional_facilities
array in that object.在每次迭代中,如果累加器(第一个参数)上尚不存在
roomNumber
则在roomNumber
处创建一个对象 - 然后,推送到该对象中的basic_facilities
和additional_facilities
数组。 At the end, use Object.values
to transform the object into an array of its values:最后,使用
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);
It seems you want to combine array of basis of roomNumber,roomType
.You can use reduce()
and findIndex()
to achieve this.似乎您想组合
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);
Just another solution...只是另一个解决方案......
...
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.