Hat JavaScript ähnliche Funktionen wie Ruby?
array.select {|x| x > 3}
Etwas wie:
array.select(function(x) { if (x > 3) return true})
pierrotlefou
Hat JavaScript ähnliche Funktionen wie Ruby?
array.select {|x| x > 3}
Etwas wie:
array.select(function(x) { if (x > 3) return true})
BoltClock
Es gibt Array.filter()
:
var numbers = [1, 2, 3, 4, 5];
var filtered = numbers.filter(function(x) { return x > 3; });
// As a JavaScript 1.8 expression closure
filtered = numbers.filter(function(x) x > 3);
Beachten Sie, dass Array.filter()
ist kein standardmäßiges ECMAScript, und es erscheint nicht in ECMAScript-Spezifikationen, die älter als ES5 sind (danke Yi Jiang und jAndy). Daher wird es möglicherweise nicht von anderen ECMAScript-Dialekten wie JScript (auf MSIE) unterstützt.
Nov. 2020 Update: Array.filter ist jetzt unterstützt in allen gängigen Browsern.
Sternkatze
Es gibt auch Array.find()
in ES6, das das erste passende Element zurückgibt, das es findet.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
const myArray = [1, 2, 3]
const myElement = myArray.find((element) => element === 2)
console.log(myElement)
// => 2
dieser gibt nur das erste gefundene Element zurück
– Georg Birbilis
25. April 2018 um 16:28 Uhr
Das ist nicht dasselbe wie Rubys Auswahl.
– sondra.kinsey
6. Januar 2019 um 18:38 Uhr
Nicht der hier angeforderte, sondern der, den ich gesucht habe. Vielen Dank!
– Sergio Gonzales
11. April um 15:43 Uhr
Tim
Underscore.js ist eine gute Bibliothek für diese Art von Operationen – es verwendet die eingebauten Routinen wie Array.filter, falls verfügbar, oder seine eigene, wenn nicht.
http://documentcloud.github.com/underscore/
Die Dokumentation gibt eine Vorstellung von der Verwendung – die Javascript-Lambda-Syntax ist bei weitem nicht so prägnant wie Ruby oder andere (ich vergesse zum Beispiel immer, eine explizite Return-Anweisung hinzuzufügen) und der Umfang ist eine weitere einfache Möglichkeit, erwischt zu werden, aber Sie können dies tun die meisten Dinge ganz einfach, mit Ausnahme von Konstrukten wie Lazy List Comprehensions.
Aus den Dokumenten für .auswählen() (.filter() ist ein Alias für dasselbe)
Durchsucht jeden Wert in der Liste und gibt ein Array aller Werte zurück, die einen Wahrheitstest (Iterator) bestehen. Delegiert an die native Filtermethode, falls vorhanden.
var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
dumm
Sie können Ihr JS mit einer ausgewählten Methode wie dieser erweitern
Array.prototype.select = function(closure){
for(var n = 0; n < this.length; n++) {
if(closure(this[n])){
return this[n];
}
}
return null;
};
jetzt können Sie dies verwenden:
var x = [1,2,3,4];
var a = x.select(function(v) {
return v == 2;
});
console.log(a);
oder für Objekte in einem Array
var x = [{id: 1, a: true},
{id: 2, a: true},
{id: 3, a: true},
{id: 4, a: true}];
var a = x.select(function(obj) {
return obj.id = 2;
});
console.log(a);
Array.filter ist in vielen Browsern nicht implementiert. Es ist besser, diese Funktion zu definieren, wenn sie nicht vorhanden ist.
Der Quellcode für Array.prototype wird in MDN veröffentlicht
if (!Array.prototype.filter)
{
Array.prototype.filter = function(fun /*, thisp */)
{
"use strict";
if (this == null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in t)
{
var val = t[i]; // in case fun mutates this
if (fun.call(thisp, val, i, t))
res.push(val);
}
}
return res;
};
}
sehen
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
für mehr Details
bei kangax.github.io/compat-table/es5/#test-Array.prototype.filter wenn man „Obsolete platform“ auswählt und dann „Array-Methoden“ erweitert, sieht man, dass „array.prototype.filter“ im IE8 nicht unterstützt wird
– Georg Birbilis
25. April 2018 um 16:25 Uhr
Bamdad
In einigen Fällen können Sie auch die verwenden map
Funktion wie unten gezeigt:
var celsiusValues = [22, 50, 310, 0, 80];
var kelvinValues = celsiusValues.map(function(x) { return x - 273; });
console.log(kelvinValues); //[-251, -223, 37, -273, -193]
oder
var people = [ {name: 'Mary', gender: 0, age: 28 }, {name: 'Sara', gender: 0, age: 17 }, {name: 'Tom', gender: 1, age: 20 }];
var titles = people.map(function(x) { return (x.gender == 0? 'Mrs.' : 'Mr.') + x.name; });
console.log(titles); //["Mrs.Mary", "Mrs.Sara", "Mr.Tom"]
var ageVrification = people.map(function(x) { return x.age >= 18; });
console.log(ageVrification); //[true, false, true]
bei kangax.github.io/compat-table/es5/#test-Array.prototype.filter wenn man „Obsolete platform“ auswählt und dann „Array-Methoden“ erweitert, sieht man, dass „array.prototype.filter“ im IE8 nicht unterstützt wird
– Georg Birbilis
25. April 2018 um 16:25 Uhr