Динамическое объединение объектов массива

#dataset #javascript #json

#набор данных #javascript #json

Вопрос:

Я хочу объединить два массива (ранжирование и совпадения), которые имеют общие свойства:

 var ranking = [{
    def: "0.58",
    league: "Scottish Premiership",
    name: "Celtic",
    off: "3.33",
    grank: "3",
    tform: "96.33",
},
{
    def: "2.52",
    league: "Scottish Premiership",
    name: "Dundee",
    off: "1.28",
    grank: "302",
    tform: "27.51",
}]

var matches = [{
date: "2010-04-22",
league: "Scottish Premiership",
home: "0.0676",
away: "0.8",
draw: "0.1324",
goals1: "3",
goals2: "1",
tform1: "96.33",
tform2: "27.51",
team1: "Celtic",
team2: "Dundee",}]
  

Ожидаемый результат выглядит следующим образом:

 [{
date: "2010-04-22",
league: "Scottish Premiership",
home: "0.0676",
away: "0.8",
draw: "0.1324",
goals1: "3",
goals2: "1",
tform1: "96.33",
tform2: "27.51",
def1: "0.58",
def2: "2.52",
off1: "3.33",
off2: "1.28",
grank1: "3",
grank2: "302",
team1: "Celtic",
team2: "Dundee",}]
  

Для объединения массивов я использовал функцию Lodash _.merge

 var result = _.merge(ranking, matches);
  

Возвращенный им результат действительно объединил некоторые объекты и опустил однородные объекты.

Пожалуйста, мне нужна некоторая помощь и понимание в решении этой задачи. Я бы не возражал против любого решения на javascript (на стороне клиента).

Ответ №1:

Вам нужно выполнить объединение по заданным данным и добавить информацию о двух командах.

 const
    keys = ['def', 'off', 'grank'],
    getRanking = (team, suffix) => Object
        .fromEntries(keys.map(k => [k   suffix, team[k]])),
    ranking = [{ def: "0.58", league: "Scottish Premiership", name: "Celtic", off: "3.33", grank: "3", tform: "96.33" }, { def: "2.52", league: "Scottish Premiership", name: "Dundee", off: "1.28", grank: "302", tform: "27.51" }],
    matches = [{ date: "2010-04-22", league: "Scottish Premiership", home: "0.0676", away: "0.8", draw: "0.1324", goals1: "3", goals2: "1", tform1: "96.33", tform2: "27.51", team1: "Celtic", team2: "Dundee" }],
    teams = Object.fromEntries(ranking.map(o => [o.name, o])),
    result = matches.map(o => ({
        ...o,
        ...getRanking(teams[o.team1], 1),
        ...getRanking(teams[o.team2], 2)
    }));

console.log(result);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }