JavaScript array.prototype如何将'this'设置为一个方法获得的新数组

时间:2016-10-20 22:20:36

标签: javascript arrays this

我试图将{random}方法定义为Array.prototype,如下所示:

Array.prototype.randomize = function() { // Yes, this method does cause the array to have 'holes', but its good enough for this example/demonstration
    var r = new Array(this.length); // Possible but somewhat unwanted to randomize the array in its place, therefore it has to be set to this new array later on.

    this.forEach(function(e) {
        r[Math.floor(Math.random() * r.length)] = e;
    });

    // how do I set 'this' to the variable r? (In order to change the array to the new and randomized array 'r')
    return r;

}

此方法确实返回随机数组,但如何更改数组本身呢?

2 个答案:

答案 0 :(得分:3)

  

无法在其位置随机化数组

Wrong

  

如何将'this'设置为变量数组'r'以便将数组更改为新数组?

这在JavaScript中是不可能的。你不能通过this引用而不是通过普通变量来覆盖对象,你必须实际改变它的属性。如果要覆盖存储数组引用的变量,则需要显式赋值给该变量;你不能通过一个方法来做(因为JS不允许传递引用),你只能覆盖这个引用,而不是所有可能包含它的变量。

答案 1 :(得分:2)

正如评论所说,在适当的位置更改阵列是更好的洗牌方式。

但如果您确实需要一次性替换所有元素,则可以使用Array#splice

<?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="90dp"
        app:cardBackgroundColor="?attr/colorPrimaryDark"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        app:cardCornerRadius="0dp"
        app:cardElevation="12dp">

<LinearLayout android:layout_width="wrap_content"
        android:layout_height="140dp"
        android:orientation="horizontal">

    <Button
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_weight="1"
        android:background="@mipmap/next"/>
    <Button
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="30dp"
        android:background="@mipmap/play" />
    <Button
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="30dp"
        android:background="@mipmap/previous"/>
    </LinearLayout>
    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/seekBar2"
        android:max="100"/>

</android.support.v7.widget.CardView>

* { box-sizing: border-box; margin: 0; vertical-align: baseline; } spread operator。它是ES2015的一部分。

Spread operator compatibility table