array.select() in JavaScript

Lesezeit: 4 Minuten

Benutzer-Avatar
pierrotlefou

Hat JavaScript ähnliche Funktionen wie Ruby?

array.select {|x| x > 3}

Etwas wie:

array.select(function(x) { if (x > 3)  return true})

Benutzer-Avatar
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.

Benutzer-Avatar
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

Benutzer-Avatar
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]

Benutzer-Avatar
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

Benutzer-Avatar
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]

1187480cookie-checkarray.select() in JavaScript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy