javascript में array.select ()


81

क्या जावास्क्रिप्ट में भी वैसी ही कार्यक्षमता है जैसी रूबी के पास है?

array.select {|x| x > 3}

कुछ इस तरह:

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

जवाबों:


135

वहाँ है 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);

ध्यान दें कि Array.filter()मानक ECMAScript नहीं है , और यह ES5 से अधिक पुराने ECMAScript चश्मे में दिखाई नहीं देता है (धन्यवाद यी जियांग और jAndy)। इस प्रकार, इसे JScript (MSIE पर) जैसी अन्य ECMAScript बोलियों द्वारा समर्थित नहीं किया जा सकता है।

नवम्बर 2020 अद्यतन : Array.filter अब सभी प्रमुख ब्राउज़रों में समर्थित है।


6

Underscore.js इस प्रकार के संचालन के लिए एक अच्छी लाइब्रेरी है - यह बिल्ट रूटीन जैसे कि Array.filter उपलब्ध होने पर उपयोग करता है, या नहीं तो अपना खुद का उपयोग करता है।

http://documentcloud.github.com/underscore/

डॉक्स उपयोग का एक विचार देगा - जावास्क्रिप्ट लैम्ब्डा सिंटैक्स रूबी या अन्य के रूप में सुसाइड के निकट कहीं नहीं है (मैं हमेशा उदाहरण के लिए एक स्पष्ट रिटर्न स्टेटमेंट जोड़ना भूल जाता हूं) और गुंजाइश को पकड़ने का एक और आसान तरीका है, लेकिन आप कर सकते हैं अधिकांश चीजें आसानी से निर्माण के अपवाद के साथ जैसे आलसी सूची की समझ।

.Select () .filter () के लिए डॉक्स से उसी के लिए एक उपनाम है)

सूची में प्रत्येक मूल्य के माध्यम से दिखता है, एक सत्य परीक्षण (पुनरावृत्ति) पास करने वाले सभी मूल्यों की एक सरणी लौटाता है। यदि यह मौजूद है, तो देशी फ़िल्टर विधि के लिए प्रतिनिधि।

  var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
  => [2, 4, 6]

5

यो आपके जेएस को इस तरह से चुनिंदा विधि से बढ़ा सकते हैं

Array.prototype.select = function(closure){
    for(var n = 0; n < this.length; n++) {
        if(closure(this[n])){
            return this[n];
        }
    }

    return null;
};

अब आप इसका उपयोग कर सकते हैं:

var x = [1,2,3,4];

var a = x.select(function(v) {
    return v == 2;
});

console.log(a);

या एक सरणी में वस्तुओं के लिए

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);

2
आपका तरीका सिर्फ पहला आइटम देता है जो मेल खाता है वह एक सरणी नहीं देता है जैसे माणिक करता है। एक छोटे से परिवर्तन के साथ हालांकि यह होगा: Array.prototyp.select = function (परीक्षण) {var new_array = [] के लिए (var n = 0; n <this.length; n ++) {if (परीक्षण (यह [n))) {new_array.push (यह [n]); }} new_array लौटाएं; };
रिबका वाटरबरी

5

Array.find()ईएस 6 में भी है जो पहले मिलान तत्व को पाता है।

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

4
यह केवल पाया गया पहला तत्व है
जॉर्ज बीरबिलिस

यह रूबी के चयन के समान नहीं है।
sondra.kinsey

4

Array.filter कई ब्राउज़रों में लागू नहीं किया गया है, यदि यह मौजूद नहीं है तो इस फ़ंक्शन को परिभाषित करना बेहतर है।

Array.prototype का स्रोत कोड MDN में पोस्ट किया गया है

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;
  };
}

देख https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter अधिक जानकारी के लिए


पर kangax.github.io/compat-table/es5/#test-Array.prototype.filter अगर एक चयन "अप्रचलित प्लेटफार्मों" और फिर फैलता है "सरणी तरीकों", वे कहते हैं कि "array.prototype.filter" देख समर्थित नहीं है IE8
जॉर्ज बीरबिलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.