【问题标题】:Getting the same Object back when using the array.filter with a valid condition使用具有有效条件的 array.filter 时获取相同的对象
【发布时间】:2017-05-07 20:24:39
【问题描述】:

我正在尝试获取 Json 对象中“文本”键的值,该对象是通过 twit 库从 GET 请求到 twitter 获得的。

我想在数组上使用过滤器函数,因为我想做函数式编程。

我可以在 T.get 函数的回调函数中使用 json 对象:

const gotData = function(err, data, response) {
 console.log(data)
}

T.get('search/tweets', params , gotData)

然后我想只过滤每个状态的文本键上的值,这是一个对象数组

所以我尝试了这个:

let results = data.statuses.filter(
    function(result){ return result.hasOwnProperty('text') 
}) 

但是我得到了相同的 data.statuses 回来......?

我只想获取对象上文本键的值,我做错了什么?

这是我的全部代码:

const Twit = require('twit')
const config = require('./config')
const T = new Twit(config)

let params  = { q: 'drum', count: 2 }

const gotData = function(err, data, response) {
  let results = data.statuses.filter(function(result){ return result.hasOwnProperty('text')})
  console.log(results)
}

T.get('search/tweets', params , gotData)

这是我得到的 Json 响应样本,它对应于 gotData 函数上的数据:

{ statuses:
   [ { created_at: 'Sun May 07 11:35:16 +0000 2017',
       id: 861182642888343600,
       id_str: '861182642888343552',
       text: '@was_going \nEvery hunk bore seven drums,\nEvery drum owned seven drums…',
       truncated: false,
       entities: [Object],
       metadata: [Object],
       source: '<a href="http://cheapbotsdonequick.com" rel="nofollow">Cheap Bots, Done Quick!</a>',
       in_reply_to_status_id: 861181362954489900,
       in_reply_to_status_id_str: '861181362954489856',
       in_reply_to_user_id: 795028044758949900,
       in_reply_to_user_id_str: '795028044758949888',
       in_reply_to_screen_name: 'was_going',
       user: [Object],
       geo: null,
       coordinates: null,
       place: null,
       contributors: null,
       is_quote_status: false,
       retweet_count: 0,
       favorite_count: 0,
       favorited: false,
       retweeted: false,
       lang: 'en' },
     { created_at: 'Sun May 07 11:35:09 +0000 2017',
       id: 861182610596405200,
       id_str: '861182610596405248',
       text: 'Would you rather have Data storage or A pedal assembly for a bass drum or high hat cymbals?',
       truncated: false,
       entities: [Object],
       metadata: [Object],
       source: '<a href="http://cheapbotsdonequick.com" rel="nofollow">Cheap Bots, Done Quick!</a>',
       in_reply_to_status_id: null,
       in_reply_to_status_id_str: null,
       in_reply_to_user_id: null,
       in_reply_to_user_id_str: null,
       in_reply_to_screen_name: null,
       user: [Object],
       geo: null,
       coordinates: null,
       place: null,
       contributors: null,
       is_quote_status: false,
       retweet_count: 0,
       favorite_count: 0,
       favorited: false,
       retweeted: false,
       lang: 'en' } ],
  search_metadata:
   { completed_in: 0.034,
     max_id: 861182642888343600,
     max_id_str: '861182642888343552',
     next_results: '?max_id=861182610596405247&q=drum&count=2&include_entities=1',
     query: 'drum',
     refresh_url: '?since_id=861182642888343552&q=drum&include_entities=1',
     count: 2,
     since_id: 0,
     since_id_str: '0' } }

【问题讨论】:

    标签: javascript twitter array-filter


    【解决方案1】:

    您只需检查是否有文本属性。您可能还想将其映射到该属性:

    let results = data.statuses.filter(
       result=>result.hasOwnProperty('text') 
    ).map(result=>result.text); 
    

    http://jsbin.com/niwezocuhu/edit?console

    或者如果你注意性能(O(n) 而不是 O(n+n*r)):

    let results= data.statuses.reduce((arr,result)=>(result.text&&arr.push(result.text)&&false)||arr,[]); 
    

    【讨论】:

    • 谢谢,不过有个问题,这个例子怎么来的:youtu.be/BMUiFMZr7vk?t=7m55s 不需要映射,它只是检查一个条件,'dogs' 被分配了一个新的过滤数组?但在这里我需要映射它吗?
    • @GiorgioMartini 他从不显示输出......是的,过滤器有效,但是你得到一个对象数组......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多