Object.assign returns 未定义
Object.assign returns undefined
即使在全局范围内声明了一个变量(赋值:对象),我得到的是 undefined:
我们的想法是获得相关的 key/value 对收入,然后以正确的顺序将其推回主要对象(因为默认情况下它没有),因此收入 [0] 被推到 data.results[0] 。我做错了什么?
//Web-scraping data
const mainURL = 'https://api.themoviedb.org/3/discover/movie?api_key=2339027b84839948cd9be5de8b2b36da&language=en-US&sort_by=revenue.desc&include_adult=false&include_video=false&page=1';
const movieBaseURL = 'https://api.themoviedb.org/3/movie/335?api_key=2339027b84839948cd9be5de8b2b36da&language=en-US';
const apiKey = '2339027b84839948cd9be5de8b2b36da';
let revenue, data, response, obj;
let ID_Array = [], keyValueArr = [], allKeyValueArr = [], objectArr = [];
let text = '';
//Get main object for d3 visualisation
(getMovieList = async() =>{
try {
response = await fetch(mainURL);
data = await response.json();
console.log(data);
console.log(data.results[0].title);
//get movie ID's
ID_Array = [].concat.apply([], data.results.map(d => d.id))
console.log(ID_Array);
getRevenueByID(ID_Array);
console.trace(getRevenueByID);
console.table(allKeyValueArr);
//inject revenue key/value
Object.keys(data.results).forEach(key => {
console.log('The name of the current key: ', key);
console.log('The value of the current key: ', data.results[key]);
data.results[key]['revenue'] = obj;
});
console.log(data);
} catch (error) {
console.log(error);
}
})();
//Retrieve revenue key/value pairs by movie ID's
getRevenueByID = async (arr) => {
for (let i = 0; i < arr.length; i++){
console.count('Count');
console.log('ID is: ', arr[i]);
getRevenueURL = await fetch('https://api.themoviedb.org/3/movie/' + arr[i] + '?api_key=' + apiKey + '&language=en-US');
let data = await getRevenueURL.json();
console.log('data received: ',data);
//return key/value array
keyValueArr = Object.entries(data)[16];
console.table(keyValueArr);
allKeyValueArr.push(keyValueArr);
//convert key/value array to object
obj = Object.assign(...allKeyValueArr.map(d => ({[d[0]]: d[1]})));
console.log('object is: ',obj);
}
};
您需要在 L:27 中 await getRevenueByID(ID_Array)
,否则 getMovieList
在获取额外数据之前继续。
这样做之后,结果如下所示:
您可能需要这个,所以您需要将 L:35 更改为 data.results[key]["revenue"] = obj['revenue'];
这是沙盒:https://codesandbox.io/s/6zzo9yrz9z
您可能希望将附加数据提取到一个对象中,并稍后将其与初始数据合并。这将使代码更易于理解。从异步计算分配给全局变量很难推理。
为了提高性能,您可以 运行 为每个条目并行获取附加数据,类似于此:
Object.keys(data.results).forEach(key => {
data.results[key]["revenue"] = getRevenue(key);
});
是否需要 await getRevenue(key)
取决于您处理结果的方式。
只需添加三行更改即可解决此问题。 My CodePen
await
将结果保存在 async
动作的变量中。
obj = await getRevenueByID(ID_Array);
- 将
revenue
节点的适当值分配给相应的结果 result object
。
data.results[key]['revenue'] = obj[data.results[key].id]['revenue'];
- 分配相应的
revenue
API 响应,因为您正在使用 for(;;)
循环。 Return 对主函数的整个响应对象。
resObj[arr[i]] = obj;
return resObj;
参考我的码笔解决方法:
https://codepen.io/aaadesh/pen/LaGLRe?editors=0010
注意全局声明和提升效果
编码愉快!!!
即使在全局范围内声明了一个变量(赋值:对象),我得到的是 undefined:
我们的想法是获得相关的 key/value 对收入,然后以正确的顺序将其推回主要对象(因为默认情况下它没有),因此收入 [0] 被推到 data.results[0] 。我做错了什么?
//Web-scraping data
const mainURL = 'https://api.themoviedb.org/3/discover/movie?api_key=2339027b84839948cd9be5de8b2b36da&language=en-US&sort_by=revenue.desc&include_adult=false&include_video=false&page=1';
const movieBaseURL = 'https://api.themoviedb.org/3/movie/335?api_key=2339027b84839948cd9be5de8b2b36da&language=en-US';
const apiKey = '2339027b84839948cd9be5de8b2b36da';
let revenue, data, response, obj;
let ID_Array = [], keyValueArr = [], allKeyValueArr = [], objectArr = [];
let text = '';
//Get main object for d3 visualisation
(getMovieList = async() =>{
try {
response = await fetch(mainURL);
data = await response.json();
console.log(data);
console.log(data.results[0].title);
//get movie ID's
ID_Array = [].concat.apply([], data.results.map(d => d.id))
console.log(ID_Array);
getRevenueByID(ID_Array);
console.trace(getRevenueByID);
console.table(allKeyValueArr);
//inject revenue key/value
Object.keys(data.results).forEach(key => {
console.log('The name of the current key: ', key);
console.log('The value of the current key: ', data.results[key]);
data.results[key]['revenue'] = obj;
});
console.log(data);
} catch (error) {
console.log(error);
}
})();
//Retrieve revenue key/value pairs by movie ID's
getRevenueByID = async (arr) => {
for (let i = 0; i < arr.length; i++){
console.count('Count');
console.log('ID is: ', arr[i]);
getRevenueURL = await fetch('https://api.themoviedb.org/3/movie/' + arr[i] + '?api_key=' + apiKey + '&language=en-US');
let data = await getRevenueURL.json();
console.log('data received: ',data);
//return key/value array
keyValueArr = Object.entries(data)[16];
console.table(keyValueArr);
allKeyValueArr.push(keyValueArr);
//convert key/value array to object
obj = Object.assign(...allKeyValueArr.map(d => ({[d[0]]: d[1]})));
console.log('object is: ',obj);
}
};
您需要在 L:27 中 await getRevenueByID(ID_Array)
,否则 getMovieList
在获取额外数据之前继续。
这样做之后,结果如下所示:
您可能需要这个,所以您需要将 L:35 更改为 data.results[key]["revenue"] = obj['revenue'];
这是沙盒:https://codesandbox.io/s/6zzo9yrz9z
您可能希望将附加数据提取到一个对象中,并稍后将其与初始数据合并。这将使代码更易于理解。从异步计算分配给全局变量很难推理。
为了提高性能,您可以 运行 为每个条目并行获取附加数据,类似于此:
Object.keys(data.results).forEach(key => {
data.results[key]["revenue"] = getRevenue(key);
});
是否需要 await getRevenue(key)
取决于您处理结果的方式。
只需添加三行更改即可解决此问题。 My CodePen
await
将结果保存在async
动作的变量中。
obj = await getRevenueByID(ID_Array);
- 将
revenue
节点的适当值分配给相应的结果result object
。
data.results[key]['revenue'] = obj[data.results[key].id]['revenue'];
- 分配相应的
revenue
API 响应,因为您正在使用for(;;)
循环。 Return 对主函数的整个响应对象。
resObj[arr[i]] = obj;
return resObj;
参考我的码笔解决方法: https://codepen.io/aaadesh/pen/LaGLRe?editors=0010
注意全局声明和提升效果
编码愉快!!!