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
} , [] )
}