Как объединить два массива объектов, у которых имя ключа отличается, но соответствующее значение одинаково? - PullRequest
2 голосов
/ 08 мая 2020
const cafes = [
  {
    name: "Bazaar Cafe",
    place_id: "kjk234g4gcvfx8usg1l33pi",
  },
  {
    name: "Ashley's Cafe",
    place_id: "12hydbdf76sljfts87sbfis",
  },
  {
    name: "Avenue Cafe",
    place_id: "skjd86svvfdrsv55svbvf3f",
  },
  {
    name: "Hi-Lo Cafe",
    place_id: "mjdhgetr4pojfyts22fzfsh",
  },
  {
    name: "California Chicken Cafe",
    place_id: "12hydbdf76sljfts87sbfis",
  },
  {
    name: "Avenue Bakery Cafe",
    place_id: "jahgde7wgdiau8ewsahgosd",
  },
  {
    name: "Philz Coffee",
    place_id: "urhw3837ehalod7w02b7835",
  },
];

const places = [
  {
    id: "jahgde7wgdiau8ewsahgosd",
    street_no: "60H",
    locality: "Solomos Island Road",
    postal_code: "20688",
    lat: "36.7783 N",
    long: "119.4179 W",
  },
  {
    id: "12hydbdf76sljfts87sbfis",
    street_no: "1B",
    locality: "Macarthur Blvd",
    postal_code: "20619",
    lat: "38.1781 N",
    long: "118.4171 W",
  },
  {
    id: "kjk234g4gcvfx8usg1l33pi",
    street_no: "45250",
    locality: "Worth Avenue, Unit A",
    postal_code: "20619",
    lat: "36.1152",
    long: "117.521",
  },
  {
    id: "saswe3s6yydtdr52hsd72yst",
    street_no: "1X",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "36.7783",
    long: "119.4179",
  },
  {
    id: "skjd86svvfdrsv55svbvf3f",
    street_no: "7S",
    locality: "Three Notch Road",
    postal_code: "20619",
    lat: "36.83",
    long: "119.6",
  },
  {
    id: "mjdhgetr4pojfyts22fzfsh",
    street_no: "22803",
    locality: "Gunston Dr Lexington Park",
    postal_code: "20688",
    lat: "35.7788",
    long: "119.979",
  },
  {
    id: "urhw3837ehalod7w02b7835",
    street_no: "225",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "35.77813",
    long: "119.41791",
  },
];

Я хочу, чтобы окончательный комбинированный массив выглядел следующим образом -

finalArr = [
  {
    id: "kjk234g4gcvfx8usg1l33pi",
    street_no: "45250",
    locality: "Worth Avenue, Unit A",
    postal_code: "20619",
    lat: "36.1152",
    long: "117.521",
    name: "Bazaar Cafe"
  },
  {
    id: "12hydbdf76sljfts87sbfis",
    street_no: "1B",
    locality: "Macarthur Blvd",
    postal_code: "20619",
    lat: "38.1781 N",
    long: "118.4171 W",
    name: "Ashley's Cafe"
  },
  {
    id: "12hydbdf76sljfts87sbfis",
    street_no: "1B",
    locality: "Macarthur Blvd",
    postal_code: "20619",
    lat: "38.1781 N",
    long: "118.4171 W",
    name: "California Chicken Cafe"
  },
  {
    id: "skjd86svvfdrsv55svbvf3f",
    street_no: "7S",
    locality: "Three Notch Road",
    postal_code: "20619",
    lat: "36.83",
    long: "119.6",
    name: "Avenue Cafe"
  },
  {
    id: "mjdhgetr4pojfyts22fzfsh",
    street_no: "22803",
    locality: "Gunston Dr Lexington Park",
    postal_code: "20688",
    lat: "35.7788",
    long: "119.979",
    name: "Hi-Lo Cafe"
  },
  {
    id: "jahgde7wgdiau8ewsahgosd",
    street_no: "60H",
    locality: "Solomos Island Road",
    postal_code: "20688",
    lat: "36.7783 N",
    long: "119.4179 W",
    name: "Avenue Bakery Cafe"
  }, 
  {
    id: "urhw3837ehalod7w02b7835",
    street_no: "225",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "35.77813",
    long: "119.41791",
    name: "Philz Coffee"
  }
];

Я пытался реализовать его таким образом, но получил только последний объект окончательного массива -

function combineById (cafes, places) {
  const finalArr = [];
  const wholeObj = {};
  const set = new Set();

  for (const cafe of cafes) { 
    let cafeId = cafe.place_id;
    let cafeName = cafe.name;
    for (const place of places) {
      if (cafeId === place.id && !set.has(cafeId)) {
        set.add(cafeId);
        wholeObj.id = place.id;
        wholeObj.streetNo = place.street_no;
        wholeObj.locality = place.locality;
        wholeObj.postalCode = place.postal_code;
        wholeObj.lat = place.lat;
        wholeObj.long = place.long;
        wholeObj.name = cafeName;
      }
    }
    finalArr.push(wholeObj);
  }
  return finalArr;
}

const resultArr = combineById(cafes, places);
console.log(resultArr);

Я пытаюсь реализовать функцию поиска, которая будет принимать два аргумента, то есть этот последний массив и условие поиска. Пока функция поиска работает нормально с массивом cafes, но у меня возникают трудности с объединением массивов places и cafes, combineById функция, возвращающая только результат последнего объединенного объекта окончательного массива. Мне нужна вся комбинация объектов в конечном массиве, чтобы позже я мог напрямую вызывать окончательный массив для дальнейших манипуляций. Пожалуйста, помогите мне найти решение. Спасибо.

Ответы [ 5 ]

3 голосов
/ 08 мая 2020

const cafes = [
  {
    name: "Bazaar Cafe",
    place_id: "kjk234g4gcvfx8usg1l33pi",
  },
  {
    name: "Ashley's Cafe",
    place_id: "12hydbdf76sljfts87sbfis",
  },
  {
    name: "Avenue Cafe",
    place_id: "skjd86svvfdrsv55svbvf3f",
  },
  {
    name: "Hi-Lo Cafe",
    place_id: "mjdhgetr4pojfyts22fzfsh",
  },
  {
    name: "California Chicken Cafe",
    place_id: "12hydbdf76sljfts87sbfis",
  },
  {
    name: "Avenue Bakery Cafe",
    place_id: "jahgde7wgdiau8ewsahgosd",
  },
  {
    name: "Philz Coffee",
    place_id: "urhw3837ehalod7w02b7835",
  },
];

const places = [
  {
    id: "jahgde7wgdiau8ewsahgosd",
    street_no: "60H",
    locality: "Solomos Island Road",
    postal_code: "20688",
    lat: "36.7783 N",
    long: "119.4179 W",
  },
  {
    id: "12hydbdf76sljfts87sbfis",
    street_no: "1B",
    locality: "Macarthur Blvd",
    postal_code: "20619",
    lat: "38.1781 N",
    long: "118.4171 W",
  },
  {
    id: "kjk234g4gcvfx8usg1l33pi",
    street_no: "45250",
    locality: "Worth Avenue, Unit A",
    postal_code: "20619",
    lat: "36.1152",
    long: "117.521",
  },
  {
    id: "saswe3s6yydtdr52hsd72yst",
    street_no: "1X",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "36.7783",
    long: "119.4179",
  },
  {
    id: "skjd86svvfdrsv55svbvf3f",
    street_no: "7S",
    locality: "Three Notch Road",
    postal_code: "20619",
    lat: "36.83",
    long: "119.6",
  },
  {
    id: "mjdhgetr4pojfyts22fzfsh",
    street_no: "22803",
    locality: "Gunston Dr Lexington Park",
    postal_code: "20688",
    lat: "35.7788",
    long: "119.979",
  },
  {
    id: "urhw3837ehalod7w02b7835",
    street_no: "225",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "35.77813",
    long: "119.41791",
  },
];

let transformed = places.reduce((result,place)=>{
  let cafe = cafes.find(c=>c.place_id===place.id);
  cafe && result.push({...place,name: cafe.name});
  return result;
},[]);

console.log(JSON.stringify(transformed, null,2));
1 голос
/ 08 мая 2020

Чтобы избежать множественных (и потенциально медленных) поисков, я бы сначала создал карту мест.

function combine(cafes, places) {

  // create Map of places with id as key
  const placesMap = new Map();
  places.forEach(place => {
    placesMap.set(place.id, place);
  });
  
  // combine each cafe with matching place
  const cafesWithPlaces = cafes.map(cafe => {
    let place = placesMap.get(cafe.place_id);
    
    // handle no matching place
    if (place === undefined) { return; }
    
    let combined = Object.assign({}, place);
    combined.name = cafe.name;
    return combined;
  });
  
  return cafesWithPlaces;
}

const cafes = [
  {
    name: "Bazaar Cafe",
    place_id: "kjk234g4gcvfx8usg1l33pi"
  },
  {
    name: "Ashley's Cafe",
    place_id: "12hydbdf76sljfts87sbfis"
  },
  {
    name: "Avenue Cafe",
    place_id: "skjd86svvfdrsv55svbvf3f"
  },
  {
    name: "Hi-Lo Cafe",
    place_id: "mjdhgetr4pojfyts22fzfsh"
  },
  {
    name: "California Chicken Cafe",
    place_id: "12hydbdf76sljfts87sbfis"
  },
  {
    name: "Avenue Bakery Cafe",
    place_id: "jahgde7wgdiau8ewsahgosd"
  },
  {
    name: "Philz Coffee",
    place_id: "urhw3837ehalod7w02b7835"
  }
];

const places = [
  {
    id: "jahgde7wgdiau8ewsahgosd",
    street_no: "60H",
    locality: "Solomos Island Road",
    postal_code: "20688",
    lat: "36.7783 N",
    long: "119.4179 W"
  },
  {
    id: "12hydbdf76sljfts87sbfis",
    street_no: "1B",
    locality: "Macarthur Blvd",
    postal_code: "20619",
    lat: "38.1781 N",
    long: "118.4171 W"
  },
  {
    id: "kjk234g4gcvfx8usg1l33pi",
    street_no: "45250",
    locality: "Worth Avenue, Unit A",
    postal_code: "20619",
    lat: "36.1152",
    long: "117.521"
  },
  {
    id: "saswe3s6yydtdr52hsd72yst",
    street_no: "1X",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "36.7783",
    long: "119.4179"
  },
  {
    id: "skjd86svvfdrsv55svbvf3f",
    street_no: "7S",
    locality: "Three Notch Road",
    postal_code: "20619",
    lat: "36.83",
    long: "119.6"
  },
  {
    id: "mjdhgetr4pojfyts22fzfsh",
    street_no: "22803",
    locality: "Gunston Dr Lexington Park",
    postal_code: "20688",
    lat: "35.7788",
    long: "119.979"
  },
  {
    id: "urhw3837ehalod7w02b7835",
    street_no: "225",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "35.77813",
    long: "119.41791"
  }
];

console.log(combine(cafes, places));
0 голосов
/ 08 мая 2020
  const cafes = [
  {
    name: "Bazaar Cafe",
    place_id: "kjk234g4gcvfx8usg1l33pi",
  },
  {
    name: "Ashley's Cafe",
    place_id: "12hydbdf76sljfts87sbfis",
  },
  {
    name: "Avenue Cafe",
    place_id: "skjd86svvfdrsv55svbvf3f",
  },
  {
    name: "Hi-Lo Cafe",
    place_id: "mjdhgetr4pojfyts22fzfsh",
  },
  {
    name: "California Chicken Cafe",
    place_id: "12hydbdf76sljfts87sbfis",
  },
  {
    name: "Avenue Bakery Cafe",
    place_id: "jahgde7wgdiau8ewsahgosd",
  },
  {
    name: "Philz Coffee",
    place_id: "urhw3837ehalod7w02b7835",
  },
];
const places = [
  {
    id: "jahgde7wgdiau8ewsahgosd",
    street_no: "60H",
    locality: "Solomos Island Road",
    postal_code: "20688",
    lat: "36.7783 N",
    long: "119.4179 W",
  },
  {
    id: "12hydbdf76sljfts87sbfis",
    street_no: "1B",
    locality: "Macarthur Blvd",
    postal_code: "20619",
    lat: "38.1781 N",
    long: "118.4171 W",
  },
  {
    id: "kjk234g4gcvfx8usg1l33pi",
    street_no: "45250",
    locality: "Worth Avenue, Unit A",
    postal_code: "20619",
    lat: "36.1152",
    long: "117.521",
  },
  {
    id: "saswe3s6yydtdr52hsd72yst",
    street_no: "1X",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "36.7783",
    long: "119.4179",
  },
  {
    id: "skjd86svvfdrsv55svbvf3f",
    street_no: "7S",
    locality: "Three Notch Road",
    postal_code: "20619",
    lat: "36.83",
    long: "119.6",
  },
  {
    id: "mjdhgetr4pojfyts22fzfsh",
    street_no: "22803",
    locality: "Gunston Dr Lexington Park",
    postal_code: "20688",
    lat: "35.7788",
    long: "119.979",
  },
  {
    id: "urhw3837ehalod7w02b7835",
    street_no: "225",
    locality: "Macarthur Blvd",
    postal_code: "20687",
    lat: "35.77813",
    long: "119.41791",
  },
];

function combineById (cafes, places) {
  const finalArr = [];
  const set = new Set();

  for (const cafe of cafes) { 
    let cafeName = cafe.name;
    for (const place of places) {
      if (cafe.place_id === place.id ) {
      finalArr.push({...cafe,...place})       
      }
    } 
  }
  return finalArr;
}
const resultArr = combineById(cafes, places);
console.log(resultArr);
0 голосов
/ 08 мая 2020

Я бы, наверное, начал с преобразования мест в ассоциативный массив. Один из способов был бы таким:

const placeMap = {};
for (let i=0;i< places.length; i++) {
  placeMap[places[i].id] = places[i];
}

Затем вы можете просто перебрать свой список кафе один раз и обновить его информацией о местоположении:

for (let i=0; i< cafes.length; i++) {
  const loc = placeMap[i.place_id];
  loc.name = cafes[i].name;
  loc.place_id = cafes[i].place_id;
  finalArr.push(loc);
}

Вы также можете выполнить sh это с помощью Для некоторых новых функций ES6 преимущество состоит в том, что вы повторяете каждый массив только 2 раза, тогда как новые функции могут потребовать большего количества итераций (обычно не имеет большого значения, но хорошо иметь в виду с большими наборами данных).

0 голосов
/ 08 мая 2020

Я думаю, вы можете решить эту проблему, просто используя map и findIndex. Попробуйте это:

const result = places.map(item => {
    const index = cafes.findIndex(cafe => cafe.place_id === item.id);

    if (index > -1) {
        item.name = cafes[index].name;
    }
    return item;
});

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...