Cheerio Map奇怪的行为

时间:2016-08-19 17:26:27

标签: node.js cheerio

我使用map和Cheerio结果列表来返回属性值。我想要的是一个包含属性值列表的变量(在这种情况下是ID' s),而是我获取ID和额外数据。

以下代码打印ID列表:

let ids = $('[data-profileid]').map(function() {
    console.log($(this).attr('data-profileid'))
})

结果:

1012938412
493240324
123948532
423948234
...

但是,以下代码返回ID,但格式不同:

let ids = $('[data-profileid]').map(function() {
    return $(this).attr('data-profileid')
})

console.log(ids)

结果:

...
'69': '234234234,
'70': '9328402397432',
'71': '1324235234',
  options:
   { withDomLvl1: true,
     normalizeWhitespace: false,
     xmlMode: false,
     decodeEntities: true },
  _root:
   { '0':
      { type: 'root',
        name: 'root',
        attribs: {},
...

这些额外数据是什么?当然不是必需的。我宁愿只有一个普通的阵列。

2 个答案:

答案 0 :(得分:10)

根据http://api.jquery.com/map/

  

由于返回值是包含数组的jQuery对象,因此它是   在结果上调用.get()以使用基本数组非常常见。

所以它看起来应该有效:

let ids = $('[data-profileid]').map(function() {
    return $(this).attr('data-profileid')
}).get()

答案 1 :(得分:2)

  

这些额外数据是什么?当然不是必需的。我宁愿只有一个普通的阵列。

Cheerio有一个流畅的 API,这意味着它的大部分功能都会返回一个可以链接其他功能的对象。如果map刚刚返回"普通数组"那么你就无法在结果上调用额外的Cheerio函数。你可以通过很多方法将其他函数调用链接到你的 map调用的结果上,这会返回一个字符串数组,但是Cheerio的开发人员(以来自jQuery的开发人员的一个提示)选择保持一致的API而不是特殊情况下的胡椒。

如果你想要一个普通的阵列,Cheerio会为你提供一个方便的toArray功能:

let ids = $('[data-profileid]').map(function() {
  return $(this).attr('data-profileid')
});

console.log(ids.toArray());
// => [ '1012938412', '493240324', '123948532', '423948234' ]