Найти уникальный идентификатор между 2 массивами - PullRequest
0 голосов
/ 02 июня 2018

После выполнения выборки в конечную точку с использованием API Fetch мой ответ состоит из объекта, содержащего 2 массива, которые выглядят примерно так:

{games_list: Array(192), owner_list: Array(4)}

В каждом массивеесть уникальный идентификатор, который разделяют оба массива например node_id

Мне нужен способ получить все игры, которые есть у одного уникального владельца, поэтому в конце у меня будет список из 4 владельцеви сколько игр у каждого владельца (надеюсь, это имеет смысл)

Пока все, что я получил, это следующее:

const getData = () => {
  fetch('./data.json')
    .then(res => res.json())
    .then(data => {
      console.log(data) // all data

      const allGames = data.games_list
      const allOwners = data.owner_list

      // Get all id's for games_list and owner_list
      const gameNodeIds = allGames.map(id => id.node_id)
      const ownerNodeIds = allOwners.map(id => id.node_id)
    })
    .catch(err =>  console.error(`Error: ${err}`))
}

Пример данныхвозвращено:

{
  "games_list": [
    {
      "game": "Overwatch",
      "game_type": "Shooter",
      "developers": "Blizzard",
      "node_id": "123456778"
    }
  ],
  .....
  "owners_list": [
    {
      "name": "John Doe",
      "age": "25",
      "Occupation": "gamer",
      "node_id": "123456778"
    }
  ]
}

Это насколько я понял, мне очень нужна помощь, чтобы двигаться дальше отсюда, поэтому вся помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Используйте объект или Карту и значение общего ключа в качестве свойств для создания counts объекта

Следующее предполагает, что некоторые игры могут не иметь владельцев в списке владельцев, и вы хотите, чтобы счетчики только для существующих владельцев

let data = {
  "games_list": [
    {
      "game": "Overwatch",
      "game_type": "Shooter",
      "developers": "Blizzard",
      "node_id": "123456778"
    }
  ],
  
  "owners_list": [
    {
      "name": "John Doe",
      "age": "25",
      "Occupation": "gamer",
      "node_id": "123456778"
    }
  ]
}
let ownerCounts = data.owners_list.reduce((a,c)=> (a[c.node_id]=0,a),{});
data.games_list.forEach(g=> g.node_id in ownerCounts && ownerCounts[g.node_id]++);

console.log(ownerCounts)

Если вы не беспокоитесь о том, что владелец игры находится в списке владельцев игры, вам нужно только просмотреть список игр

let data = {
  "games_list": [
    {
      "game": "Overwatch",
      "game_type": "Shooter",
      "developers": "Blizzard",
      "node_id": "123456778"
    }
  ],
  
  "owners_list": [
    {
      "name": "John Doe",
      "age": "25",
      "Occupation": "gamer",
      "node_id": "123456778"
    }
  ]
}
let ownerCounts = data.games_list.reduce((a,c)=> (a[c.node_id]= (a[c.node_id]||0)+1,a),{});


console.log(ownerCounts)
0 голосов
/ 02 июня 2018

Вы можете комбинировать map() и filter(), чтобы вернуть желаемый результат с желаемой структурой

См. Фрагмент кода

var data = {
  "games_list": [
    {
      "game": "game1",
      "game_type": "Shooter",
      "developers": "Blizzard",
      "node_id": "1"
    },
     {
      "game": "game2",
      "game_type": "Shooter",
      "developers": "Blizzard",
      "node_id": "1"
    },
     {
      "game": "game3",
      "game_type": "Shooter",
      "developers": "Blizzard",
      "node_id": "2"
    }
  ],

  "owners_list": [
    {
      "name": "owner 1",
      "age": "25",
      "Occupation": "gamer",
      "node_id": "1"
    },
    {
      "name": "owner 2",
      "age": "25",
      "Occupation": "gamer",
      "node_id": "2"
    },
    {
      "name": "owner 3",
      "age": "25",
      "Occupation": "gamer",
      "node_id": "3"
    }
   
  ]
}

const allGames = data.games_list;
const allOwners = data.owners_list;


var result = allOwners.map(owner => 
  ({owner: owner.name,
    games:allGames.filter(game => game.node_id === owner.node_id
  ).length 
  })
)

console.log(result);
0 голосов
/ 02 июня 2018

Итак, вам нужно выяснить, сколько раз ваш конкретный node_id существует во всех играх?

var games_by_owner = {};
allOwners.forEach(function(ele, idx){
   gameNoeIds.forEach(function(eleG, idxG){
       if(typeof games_by_owner[idx] == 'undefined') {
           games_by_owner[idx] = [];
       }

       if (ele.node_id == eleG.node_id) {      
           games_by_owner[idx].push(idxG);
       }
   });
});

Таким образом, вы будете собирать для каждого массива idx Владельца его idxG Игр.

...