未在阵列

时间:2018-04-20 01:44:06

标签: javascript

所以我试图迭代并映射这个数组并从中提取数据。当试图运行代码时,我得到一个错误说" data.data.children.map(...)。然后不是函数",即使data.data.children是一个数组。谢谢。



var output
fetch('https://www.reddit.com/r/somesubreddit/hot/.json?count=20')
  .then(response => response.json())
  .then(data => {
    //console.log(data.data.children)
    data.data.children.map(hit => output = {
      score: hit.score,
      title: hit.title,
      permalink: hit.permalink
    }).then(result => {
      var done = result.sort(function(a, b) {
        return b.score - a.score
      })
      this.setState({
        hits: done
      })
    })
  }).catch(err => console.log(err.message)); // To illustrate your error




2 个答案:

答案 0 :(得分:1)

Array.prototype.map没有返回Promise。您无法使用.then()来链接其输出。

.map()应该是同步的,因此无需使用.then()。只需立即使用其输出:

var output
fetch('https://www.reddit.com/r/somesubreddit/hot/.json?count=20')
    .then(response => response.json())
    .then(data => {
        console.log(data.data.children)
        var result = data.data.children.map(hit => output = {
            score: hit.score,
            title: hit.title,
            permalink: hit.permalink
        });

        var done = result.sort(function(a, b) {
            return b.score - a.score
        })
        this.setState({
            hits: done
        })
    });

您可以通过链接mapsort的输出来进一步简化此操作,以删除中间变量:

var output
fetch('https://www.reddit.com/r/somesubreddit/hot/.json?count=20')
    .then(response => response.json())
    .then(data => {
        console.log(data.data.children)
        var result = data.data.children.map(hit => {
            score: hit.score,
            title: hit.title,
            permalink: hit.permalink
        }).sort(function(a, b) {
            return b.score - a.score
        });

        this.setState({
            hits: result
        })
    });

请注意,您仅在.then()来电时使用fetch()来电,因为Fetch API基于承诺。在fetch之外或其回调中的任何实现默认情况下都不会隐式使用Promises,因此您不能在它们上使用.then()

答案 1 :(得分:0)

您有几个错误

  1. map返回一个没有.then方法
  2. 的数组
  3. output = { ...无需output变量
  4. 数据不是您认为的格式
  5. fetch('https://www.reddit.com/r/somesubreddit/hot/.json?count=20')
        .then(response => response.json())
        .then(data => data.data.children.map(({data:{score, title, permalink}}) => ({score, title, permalink})))
        .then(result => {
            var done = result.sort(function(a, b) {
                return b.score - a.score
            });
            /*
            this.setState({
                hits: done
            });
            */
            console.log(done);
        })

    注意:上面也可以写

    fetch('https://www.reddit.com/r/somesubreddit/hot/.json?count=20')
    .then(response => response.json())
    .then(data => {
        var done = data.data.children.map(({data:{score, title, permalink}}) => ({score, title, permalink}))
        .sort(function(a, b) {
            return b.score - a.score
        });
        /*
        this.setState({
            hits: done
        });
        */
        console.log(done);
    })
    

    由于.map不需要在单独的.then中完成,因为它是同步的