Vraag Welke functie fungeert als. Selecteer Veel () in jQuery?


Laat me meer uitleggen:

we weten dat de kaartfunctie in jQuery fungeert als .Selecteer () (zoals in LINQ).

$("tr").map(function() { return $(this).children().first(); }); // returns 20 tds

nu is de vraag hoe kunnen we hebben. Selecteer veel () in jQuery?

$("tr").map(function() { return $(this).children(); }); // returns 10 arrays not 20 tds!

hier is mijn voorbeeld in actie: http://jsfiddle.net/8aLFQ/4/
"l2" moet 8 zijn als we veel hebben geselecteerd.

[OPMERKING] blijf alsjeblieft niet bij dit voorbeeld, bovenstaande code is gewoon laten zien wat ik bedoel met SelectMany () anders is het heel gemakkelijk om $ ("tr") te zeggen. Children ();

Ik hoop dat het duidelijk genoeg is.


34
2017-07-25 18:50


oorsprong


antwoorden:


map native arrays afvlakken. Daarom kun je schrijven:

$("tr").map(function() { return $(this).children().get(); })

Je moet bellen .get() om een ​​native array in plaats van een jQuery-object te retourneren.

Dit zal ook werken op reguliere objecten.

var nested = [ [1], [2], [3] ];
var flattened = $(nested).map(function() { return this; });

flattened zal gelijk zijn [1, 2, 3].


43
2017-07-25 19:09



Jij wilt dit:

$("tr").map(function() { return $(this).children().get(); });

Live demonstratie:  http://jsfiddle.net/8aLFQ/12/


25
2017-07-25 19:09



Je gaat jezelf schoppen:

$("tr").map(function() { return [ $(this).children() ]; }); 

Het zijn de simpele dingen in het leven die je koestert.    - Fred Kwan

BEWERK: Wauw, dat zal me leren om de antwoorden niet grondig te testen.

De handleiding zegt dat map plats arrays, dus ik ging ervan uit dat het een arrayachtig object zou afvlakken. Nee, je moet het expliciet converteren, zoals zo:

$("tr").map(function() { return $.makeArray($(this).children()); }); 

Dingen moeten zo eenvoudig mogelijk zijn, maar niet eenvoudiger. - Albert Einstein


5
2017-07-25 18:57



$.map verwacht dat een waarde (of een reeks waarden) wordt geretourneerd. Het jQuery-object dat u retourneert, wordt gebruikt als een "waarde" in plaats van een "array" (die wordt afgeplat)

Het enige dat u hoeft te doen, is de array met DOM-elementen retourneren. jQuery biedt een .get() methode die een gewone array uit een selectie retourneert.

$("tr").map(function() { return $(this).children().get() });

Natuurlijk begrijp ik dat dit een heel gekunsteld voorbeeld is, sindsdien $("tr").children() doet hetzelfde met veel minder functieaanroepen.

http://jsfiddle.net/gnarf/8aLFQ/13/


4
2017-07-25 19:12



Niet zeker over .selectMany() maar je zou de positie van kunnen veranderen .children om het gewenste resultaat te krijgen.

var l2 = $("tr").children().map(function() { return $(this); }).length;

http://jsfiddle.net/8aLFQ/5/

BEWERK

Ik denk dat ik beter begrijp wat je wilt na het volgen van de opmerkingen.

Je kan bellen $.makeArray(l2) om terug te keren naar wat je zoekt ... dat zijn 8 objecten / matrices

http://jsfiddle.net/8aLFQ/10/


1
2017-07-25 18:56



Ik had dezelfde vraag voor reguliere arrays, en dit is de enige referentie die ik kon vinden in StackOverflow, dus ik zal het antwoord toevoegen dat ik bedacht heb.

Voor reguliere arrays kunt u gebruiken

Array.prototype.selectMany = function (selector) {
    return this.map(selector).reduce(function (a, b) {
        return a.concat(b);
    });
};

Dus [[1, 2], [3, 4], [5, 6, 7]].selectMany(function (a) { return a; }) evalueert naar [1, 2, 3, 4, 5, 6, 7].

Om dit in jQuery te gebruiken, moet je je jQuery-set in een array converteren voordat je hem gebruikt:

var result = $("tr").get().selectMany(function(a) { 
    return Array.prototype.slice.call(a.childNodes); 
});

1
2018-05-16 15:12