#javascript #reactjs #api #object
#javascript #reactjs #API #объект
Вопрос:
У меня есть два набора данных, и я пытаюсь их объединить, но понятия не имею, с чего начать. Я выполняю два вызова API, и ниже приведен небольшой пример ответа:
{
early_game_items: {
57: 16
59: 60
106: 1
180: 54
214: 28
232: 6
},
late_game_items: {
108: 1
116: 1
},
mid_game_items: {
1: 52
102: 3
108: 4
116: 1
193: 1
194: 1
223: 1
232: 73
}
}
Другой набор данных пронумерован от 1 до 300 и представляет собой объект, состоящий из других объектов. Ниже приведен фрагмент:
const items = [{
"id": 57,
"name": "void_stone",
"cost": 825,
"secret_shop": 1,
"side_shop": 0,
"recipe": 0,
"localized_name": "Void Stone"
},
{
"id": 58,
"name": "mystic_staff",
"cost": 2700,
"secret_shop": 1,
"side_shop": 0,
"recipe": 0,
"localized_name": "Mystic Staff"
},
{
"id": 59,
"name": "energy_booster",
"cost": 900,
"secret_shop": 1,
"side_shop": 0,
"recipe": 0,
"localized_name": "Energy Booster"
}...]
Мне нужно поместить данные из второго набора данных в первый, сопоставив ключ в первом наборе данных с идентификатором во втором. Например:
{
early_game_items: {
57: {amount: 16, name: 'void_stone', cost: 825}
59: {amount: 60...
106: {amount: 1...
180: {amount: 54...
214: {amount: 28...
232: {amount: 6...
}...
Большое вам спасибо за просмотр этого! Я новичок в js и действительно пытаюсь учиться.
Комментарии:
1. Как выглядит второй набор данных, это объект с числами в качестве ключей, например: { 0: { id: 57, name: «, … }, 1: { id: 58, … }, …} ?
2. @domenikk Мне жаль, что это было написано не очень хорошо. Я добавил больше ко второму набору данных. Это просто объекты внутри объекта. Мне нужно сопоставить ключ в первом наборе данных с идентификатором во втором
3. В объекте не может быть объектов (или любых других значений) без ключей, то, что вы написали, указывает на то, что они являются элементами массива. Пожалуйста, проверьте мой ответ.
4. я просмотрел ваше решение, и я получаю undefined для item. Он находит оба идентификатора, но не сохраняет их в переменной. Не уверен, что происходит. Я пытался это исправить, но безуспешно
5. Я исправил сравнение с === на ==
Ответ №1:
Например, другой ответ, в котором указаны наборы данных dataset1 amp; dataset2 и предполагается, что dataset2 представляет собой массив объектов. Если dataset2 представляет собой большой массив, этот ответ имеет лучшую производительность:
let result = {};
// key = 'early_game_items', 'mid_game_items', 'late_game_items'
for(let key in dataset1) {
result[key] = {};
for(let id in dataset1[key]) {
result[key][id] = { amount: dataset1[key][id] };
}
}
for(let id in dataset2) {
for(let key in dataset1) {
let _item;
if(_item=result[key][id]){
const { name, cost } = dataset2[id];
_item.name = name;
_item.cost = cost;
}
}
}
console.log(result);
Комментарии:
1. Лол, ты просто скопировал вставленный мой ответ
Ответ №2:
Присвоение имен наборам данных dataset1 amp; dataset2 и предположение, что dataset2 представляет собой массив объектов:
let result = {};
// key = 'early_game_items', 'mid_game_items', 'late_game_items'
for(let key in dataset1) {
const itemGroup = dataset1[key];
let _itemGroup = {};
for(let id in itemGroup) {
let _item = { amount: itemGroup[id] };
// find item by id, in second dataset
const item = dataset2.find(i => i.id == id) || {};
// get name amp; cost via destructuring
const { name, cost } = item;
_item.name = name;
_item.cost = cost;
// store in new itemGroup
_itemGroup[id] = _item;
}
// store in result
result[key] = _itemGroup
}
console.log(result);
Если dataset2 является объектом с числами в качестве ключей, вам нужно будет изменить функцию «найти по идентификатору»:
// find item by id, in second dataset
const item = Object.values(dataset2).find(i => i.id === id) || {};