Object.assign返回未定义

时间:2019-03-01 07:43:53

标签: javascript json object undefined key-value

即使在全局范围中声明了变量(具有指定值:对象),我也得到了 未定义

enter image description here

想法是获取相关的键/值对收入,然后以正确的顺序将其推回到主对象(默认情况下没有),从而将收入[0]推入数据。 [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);
        }
    };

2 个答案:

答案 0 :(得分:1)

您需要在L:27中await getRevenueByID(ID_Array),否则getMovieList在获取附加数据之前会继续。

这样做之后,结果如下所示: enter image description here

您可能想要这样做,因此需要将L:35更改为data.results[key]["revenue"] = obj['revenue'];

enter image description here

这是沙箱:https://codesandbox.io/s/6zzo9yrz9z

您可能希望将其他数据提取到一个对象中,然后将其与初始数据合并。这将使代码更容易理解。从异步计算分配给全局变量很难推理。

为了提高性能,您可以并行获取每个条目的附加数据,类似于以下内容:

Object.keys(data.results).forEach(key => {
  data.results[key]["revenue"] = getRevenue(key);
});

是否需要await getRevenue(key)取决于结果的处理方式。

答案 1 :(得分:1)

只需添加三行更改即可解决此问题。 My CodePen

  1. await将结果保存在async操作的变量中。
obj = await getRevenueByID(ID_Array);
  1. revenue节点的适当值分配给相应的结果result object
data.results[key]['revenue'] = obj[data.results[key].id]['revenue'];
  1. 使用revenue循环时,为其id节点分配相应的for(;;) API响应。将整个响应对象返回到主函数。

resObj[arr[i]] = obj;

return resObj;

请参阅我的代码笔以获取解决方案: https://codepen.io/aaadesh/pen/LaGLRe?editors=0010

注意全局声明和吊装效果。

快乐编码!