массив слияния javascript, если внутренние объекты совпадают - PullRequest
0 голосов
/ 12 марта 2019

кто-нибудь в сети.Мне нужна помощьУ меня есть такой массив.

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

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

Кажется, вы хотите объединить массив базисов 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);
0 голосов
/ 12 марта 2019

Просто другое решение ...

...
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);
  }
} 
0 голосов
/ 12 марта 2019

Похоже, что вы пытаетесь объединить элементы в объект во время итерации, что является правильной идеей, но метод, который нужно использовать для этого, - reduce: первым аргументом для обратного вызова будет возвращаемое значениеиз последней итерации (или, на первой итерации, начальное значение - второй аргумент, переданный .reduce).

На каждой итерации создайте объект на roomNumberесли он еще не существует в аккумуляторе (первый аргумент) - тогда нажмите на массив basic_facilities и additional_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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...