Array.from()‎

من موسوعة حسوب
مراجعة 05:32، 31 ديسمبر 2017 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الدالة Array.from()‎ تُنشِئ مصفوفة جديدة من كائن شبيه بالمصفوفات.

البنية العامة

Array.from(arrayLike[, mapFn[, thisArg]])

arrayLike

الكائن الشبيه بالمصفوفات الذي نريد تحويله إلى مصفوفة.

mapFn

دالة الربط (map function) التي ستستدعى على كل عنصر من عناصر المصفوفة.

thisArg

القيمة التي ستستخدم في this عند استدعاء mapFn.

القيمة المعادة

مصفوفة جديدة.

الوصف

الدالة Array.from()‎ تسمح بإنشاء مصفوفات من كائنات شبيهة بالمصفوفات (array-like objects)، أي الكائنات التي لها الخاصية length وفيها عناصر مُفهرَسة.

تملك الدالة Array.from()‎ وسيطًا اختياريًا باسم mapFn، الذي يسمح بتنفيذ دالة map على كل عنصر من عناصر المصفوفة التي ستُنشَأ.

لاحظ أنَّ قيمة length للدالة from()‎ هي 1.

أمثلة

مصفوفة من String

Array.from('foo'); 
// ["f", "o", "o"]

مصفوفة من Set

var s = new Set(['foo', window]); 
Array.from(s); 
// ["foo", window]

مصفوفة من Map

var m = new Map([[1, 2], [2, 4], [4, 8]]);
Array.from(m); 
// [[1, 2], [2, 4], [4, 8]]

مصفوفة من كائن شبيه بالمصفوفات (arguments)

function f() {
  return Array.from(arguments);
}

f(1, 2, 3);

// [1, 2, 3]

استخدام الدوال السهمية مع Array.from()‎

استخدام دالة سهمية في المعامل mapFn لتعديل القيم المُضافة إلى المصفوفة:

Array.from([1, 2, 3], x => x + x);      
// [2, 4, 6]

توليد سلسلة من الأرقام، ولمّا كانت المصفوفة مُهيّئة مع القيم undefined في كل موضع، فستكون قيمة v في المثال الآتي هي undefined:

Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]

تعويض نقص دعم المتصفحات

أُضيفَت الدالة Array.from أوّل مرة في معيار ECMAScript 2015 (أي ES6)، وهذا يعني أنَّ هنالك بعض المتصفحات التي لم تدعم هذه الدالة بعد، لكن يمكن الالتفاف على هذه المشكلة باستخدام الشيفرة الآتية:

// Production steps of ECMA-262, Edition 6, 22.1.2.1
if (!Array.from) {
  Array.from = (function () {
    var toStr = Object.prototype.toString;
    var isCallable = function (fn) {
      return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
    };
    var toInteger = function (value) {
      var number = Number(value);
      if (isNaN(number)) { return 0; }
      if (number === 0 || !isFinite(number)) { return number; }
      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
    };
    var maxSafeInteger = Math.pow(2, 53) - 1;
    var toLength = function (value) {
      var len = toInteger(value);
      return Math.min(Math.max(len, 0), maxSafeInteger);
    };

    // The length property of the from method is 1.
    return function from(arrayLike/*, mapFn, thisArg */) {
      // 1. Let C be the this value.
      var C = this;

      // 2. Let items be ToObject(arrayLike).
      var items = Object(arrayLike);

      // 3. ReturnIfAbrupt(items).
      if (arrayLike == null) {
        throw new TypeError('Array.from requires an array-like object - not null or undefined');
      }

      // 4. If mapfn is undefined, then let mapping be false.
      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
      var T;
      if (typeof mapFn !== 'undefined') {
        // 5. else
        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
        if (!isCallable(mapFn)) {
          throw new TypeError('Array.from: when provided, the second argument must be a function');
        }

        // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (arguments.length > 2) {
          T = arguments[2];
        }
      }

      // 10. Let lenValue be Get(items, "length").
      // 11. Let len be ToLength(lenValue).
      var len = toLength(items.length);

      // 13. If IsConstructor(C) is true, then
      // 13. a. Let A be the result of calling the [[Construct]] internal method 
      // of C with an argument list containing the single item len.
      // 14. a. Else, Let A be ArrayCreate(len).
      var A = isCallable(C) ? Object(new C(len)) : new Array(len);

      // 16. Let k be 0.
      var k = 0;
      // 17. Repeat, while k < len… (also steps a - h)
      var kValue;
      while (k < len) {
        kValue = items[k];
        if (mapFn) {
          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
        } else {
          A[k] = kValue;
        }
        k += 1;
      }
      // 18. Let putStatus be Put(A, "length", len, true).
      A.length = len;
      // 20. Return A.
      return A;
    };
  }());
}

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 45 32 غير مدعومة نعم 9

على النقيض من متصفح IE، يدعم Edge هذه الميزة.

مصادر ومواصفات