2017-01-12 5 views
2

Ich kann nicht für das Leben von mir, den Unterschied zwischen diesen beiden Blöcken von Code herauszufinden:Unterschiedliche Ausgabe von .map() und .each()

var text = []; 
$(".article-text p").each(function() { 
    text.push($(this).text()); 
}); 

Und

var text = $('.article-text p').map(function() { 
    return $(this).text(); 
}); 

Sie schauen für mich, wie sie die gleiche genaue Ausgabe produzieren, wenn sie in der Konsole auf the following page geprüft werden. Der erste kann jedoch von JSON.stringify ausgeführt werden, und der zweite nicht.

Meine Fehlermeldung in dem Crawler sagt

Error invoking user-provided 'pageFunction': Error: TypeError: JSON.stringify cannot serialize cyclic structures.

Meine Fehlermeldung in der Konsole sagt:

Uncaught DOMException: Blocked a frame with origin " http://yaledailynews.com " from accessing a cross-origin frame. at JSON.stringify() at :1:6

Wenn ich die zwei Objekte zu vergleichen, sie sehen genau gleich aus, mit der Ausnahme, dass der zweite hat eine context Eigenschaft. Ich habe diese Eigenschaft gelöscht, aber die Fehler bleiben bestehen.

+7

[ '$ .map()'] (https://api.jquery.com/map/) gibt ein Objekt jQuery: „_Als der Rückgabewert ist ein Objekt jQuery , das ein Array enthält, ist es sehr üblich, .get() im Ergebnis aufzurufen, um mit einem einfachen Array zu arbeiten._ " – Andreas

+2

Wenn eine jQuery-Methode etwas Unerwartetes oder Unerwartetes zu tun scheint, sehen Sie sich die Dokumentation an. Es ist nicht perfekt, aber es ist sehr gut und dokumentiert eindeutig, was die Methode macht, welche Argumente sie erwarten und was sie zurückgibt. –

+0

@Andreas mein schlecht, du hast Recht :) – nem035

Antwort

2

Aus der Dokumentation für jQuery.map

Array-like objects — those with a .length property and a value on the .length - 1 index — must be converted to actual arrays before being passed to $.map() . The jQuery library provides $.makeArray() for such conversions.

Seit $('.article-text p') wird ein Array-ähnliche Sammlung (von jQuery-Objekte) zurückkehren, Sie $.makeArray auf sie rufen müssen:

function one() { 
 
    var text = []; 
 
    $(".test").each(function() { 
 
    text.push($(this).text()); 
 
    }); 
 
    return text; 
 
} 
 

 
function two() { 
 
    var text = $('.test').map(function() { 
 
    return $(this).text(); 
 
    }); 
 
    return text; 
 
} 
 

 
console.log(one()); 
 
// use makeArray here 
 
console.log($.makeArray(two()));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="test">A</div> 
 
<div class="test">B</div> 
 
<div class="test">C</div>

Docs auch sagen

As the return value is a jQuery object, which contains an array, it's very common to call .get() on the result to work with a basic array.

function one() { 
 
    var text = []; 
 
    $(".test").each(function() { 
 
    text.push($(this).text()); 
 
    }); 
 
    return text; 
 
} 
 

 
function two() { 
 
    var text = $('.test').map(function() { 
 
    return $(this).text(); 
 
    }).get(); // <--- call get here 
 
    return text; 
 
} 
 

 
console.log(one()); 
 
console.log(two());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="test">A</div> 
 
<div class="test">B</div> 
 
<div class="test">C</div>

Verwandte Themen