2017-11-06 9 views
0

JavaScriptでPythonの配列インデックスシステムを複製する方法はありますか?これは、取得JavaScriptでのPython配列インデックスシステムの複製

last = arr[-1] 
secondLast = arr[-2] 

:私は例えばPythonの道を、使用して要素にアクセスできる方法はあり

last = arr[arr.length - 1] 
secondLast = arr[arr.length - 2] 

は、私がこれを行う必要があるだろう、JavaScriptで最後の要素にアクセスするにはあなたが配列の配列を持っているときは本当に面倒です。

arr = [[1, 2], [3, 4], [5, 6]] 

// In JavaScript, to get 6: 
lastJS = arr[arr.length - 1][arr[arr.length - 1].length - 1] 

# In Python, simple: 
lastPy = arr[-1][-1] 

私がオンラインで見てきたのは、Array.prototypeを使ってarr.lastまたはarr.last()を許可するだけです。

答えて

1

いいえJavaScriptはオペレータのオーバーロードをサポートしていません。ただし、Pythonのインデックス処理をサポートするメソッドを自分で実装することはできます。

編集:私はあなたが(ES6 +で)Proxyを使用して、その効果を再作成することができたと、私はそれをお勧めしません:https://jsfiddle.net/DerekL/Lfjznnbb/

class PythonArray { 
    constructor() { 
     return new Proxy([], { 
      get: function(target, name) { 
       var index = parseInt(name, 10); 

       if (name === NaN) { 
        if (name in target) return target[name]; 
        else throw "Not a number"; 
       } 

       // simple implementation 
       if(index < 0) return target[target.length + index]; 
       else return target[index]; 
      } 
     }); 
    } 

    static from(arr){ 
     var pythonArray = new PythonArray(); 
     for(var i = 0; i < arr.length; i++){ 
      pythonArray[i] = arr[i]; 
     } 
     return pythonArray; 
    } 
} 

var arr = PythonArray.from([1, 2, 3]); 
console.log(arr[0]);   // 1 
console.log(arr[-1]);  // 3 
console.log(arr.join("|")); // still works 
+0

の最後の要素にアクセスできますPrototype機能getFromLast()を追加しますか?私はArray.prototypeを使って成功しなかった。配列が単なるオブジェクトであると仮定すると、私はarr [-1]がいくつかの修正を加えれば有効な構文であるべきだと思っています。 – Michael

+0

あなたは技術的にこれを行うことができます:https://jsfiddle.net/DerekL/Lfjznnbb/ですが、プロダクションコードで使用しないでください! –

0

あなたはObject.defineProperty

Object.defineProperty(Array.prototype, "-1", { 
    get : function(index){ return this[this.length - 1]) } 
}); 

これを使用して次のことを試すことができます-1の最後の値が返されますが、一般的な値を定義することはできません。

デモ

var arr = ["A", "B", "C"]; 
 
console.log("Before " , arr[ -1 ]); 
 
Object.defineProperty(Array.prototype, "-1", { 
 
    get : function(index){ return this[this.length - 1]; } 
 
}); 
 
console.log("After " , arr[ -1 ]);

同様に、あなたは他の負のインデックスのプロパティを定義することができます。

0

あなたはこのような関数を作成することによって、それを達成できます。

var some_array = ["name", "game", "fame"]; 
 

 
function getElement(array, index) { 
 
    return (array[array.length + (index)]); 
 
}; 
 

 
console.log(getElement(some_array, -1));

0

配列が同様のオブジェクトです。

let arrayObj = [] 
arrayObj[-1] = "I exist"; 
console.log(arrayObj) // [ '-1': 'I exist' ] 

したがって、array[-1]を使用すると、最後のインデックスには適していません。

代わりに、単にメソッドを実装する方法があり、あなたの配列

Array.prototype.getFromLast = function(index) { 
    return this[this.length-index-1]; 
} 
a = [1,23,123,4,1,1231,12] 
a.getFromLast(3) // 4 
+0

Array.prototypeの変更は一般的には悪いことです。この場合もそうでしょうか? – Michael

+0

これを自分で行い、出荷可能な製品で使用しない場合は、危険はありません。あなたが出荷する製品は、異なる環境で使用され、追加された機能は、他の人が使用する類似のものと一致することがあります。詳細はこちらを参照してください https://stackoverflow.com/questions/8859828/javascript-what-dangers-are-in-extending-array-prototype – Prasanna

+0

ネイティブプロトタイプを変更することは、一般的には悪いことです。 Prototype.jsが作成した混乱を見てください。 –

関連する問題