Javascript 使用map.call返回对象

Javascript 使用map.call返回对象,javascript,Javascript,这项工作: evaluate(function() { return Array.prototype.map.call(document.querySelectorAll('.container .title'), function(e) { return e.querySelector('.title').textContent; }); } evaluate(function() { return Array.prototype.map.call(do

这项工作:

evaluate(function() {
    return Array.prototype.map.call(document.querySelectorAll('.container .title'), function(e) {
        return e.querySelector('.title').textContent;
    });
}
evaluate(function() {
    return Array.prototype.map.call(document.querySelectorAll('.container .title a'), function(e) {
        return e.querySelector('.title a').href;
    });
}
evaluate(function() {
    return Array.prototype.map.call(document.querySelectorAll('.container img'), function(e) {
        return e.querySelector('img').src;
    });
}
。。但是,我希望将所有结果作为单个对象返回,但这不起作用,因为我不知道如何获取索引:

evaluate(function() {
    return Array.prototype.map.call(document.querySelectorAll('.container'), function(e) {
        var data = {};
        data[index].title = e.querySelector('.title').textContent;
        data[index].link = e.querySelector('.title').href;
        data[index].image = e.querySelector('img').src;
        // return all results in a single object with each containing title, link and image
        return data; 
    });
}
这是完整的功能:

new Nightmare(
        .goto('https://www.example.com')
        .insert('form[id="gbqf"] input[id="gbqfq"]', 'keyword here')
        .click('form[id="gbqf"] button[id="gbqfb"]')
        .wait('.sh-sr__shop-result-group')
        .visible('.sh-sr__shop-result-group')
        .evaluate(function() {
            return Array.prototype.map.call(document.querySelectorAll('.sh-sr__shop-result-group .psli'), function(data, e) {
                data.push({
                    title: e.querySelector('.pslmain h3').textContent,
                    thumb: e.querySelector('.pslimg img').src,
                    link: e.querySelector('.pslmain h3 a').href,
                    price: e.querySelector('.pslline .price').textContent,
                    stars: e.querySelector('span._Ezj div').getAttribute('aria-label'),
                    ratings: e.querySelector('a.shop__secondary.sh-rt__product').textContent,
                    //features: e.querySelector('._Lqc .shop__secondary _MAj').innerHTML,
                    //description: e.querySelector('._Lqc').textContent
                });
                return data;
            });
        })
        .end()
        .then(function(result) {
            console.log(result);
        })
        .catch(function(error) {
            console.error('Search failed:', error);
        });

您可以在映射之前迭代document.querySelectorAll('.container'),并使用索引构建一个数组,如:

var kvArray = [{index:0, value:document.querySelectorAll('.container')[0]}, {index:2, value:20}, {index:3, value: 30}];
var reformattedArray = kvArray.map(function(obj){ 
   var rObj = {};
   rObj[obj.key] = obj.valor;
   return rObj;
});
并使用对象密钥访问rObj对应位置

无论如何,从文档中,似乎可以从回调函数中获取索引。请看一下:


希望能有帮助

我不确定您希望最终对象是什么形状。但这似乎尽可能接近第一次实现

function evaluate(containerName){
  return Array.prototype.reduce.call(document.querySelectorAll(containerName), function(acc , e){
    acc.push({
      title: e.querySelector('.title').textContent, 
      link: e.querySelector('.title a').href,
      image: e.querySelector('img').src
    }) 
    return acc 
  } , [] )
}

返回与容器索引对应的OBJ数组

注意,
.textContent
不是一个函数,请在
数据[index].title=e.querySelector('.title').textContent()
@guest271314处删除
()
,我没有创建对象的索引值。您没有在
.map()
回调
(e,index)
处定义
索引
参数。为什么需要在返回的对象上定义
索引
属性?返回的数组应按
document.querySelectorAll('.container')
的顺序排列。回调中的
数据将是数组中的每个元素,该数组没有
.push()
方法。您应该只是返回对象<代码>返回{title:…,thumb:…}
…如下:结果是一个对象数组,其中对于
querySelectorAll
找到的每个元素,新数组中将有一个新对象。第一次迭代后将抛出一个错误。您似乎试图使用
.reduce()
代替
.map()
。为什么不直接使用
.map()
?我认为不会,我将使用reduce测试它,因为他需要一个对象。您的回调没有返回值,因此
acc
在第一次迭代后将
未定义。此外,对象的语法错误为
=
。您的累加器是一个数组,因此看起来您正在创建一个对象数组,这就是
.map()
的设计目的。@squint谢谢。我想这已经实现了他想要的。@3zzy:我不知道你指的是aeid的答案还是上面我的JSFIDLE链接。不管怎样,你很接近。只需要返回对象而不是推它。
function evaluate(containerName){
  return Array.prototype.reduce.call(document.querySelectorAll(containerName), function(acc , e){
    acc.push({
      title: e.querySelector('.title').textContent, 
      link: e.querySelector('.title a').href,
      image: e.querySelector('img').src
    }) 
    return acc 
  } , [] )
}