PythonコードをJavaScriptで書き直した時に困ったこと

# 目次
1. [困ったこと](#anchor1)
1. [配列の最後の要素を取り出す方法](#anchor2)
1. [配列のコピー(参照渡しと値渡しの違い）](#anchor3)
    1. [参照渡し](#anchor4) 
    1. [値渡し](#anchor5)
1. [配列へ代入と削除（appendとextendとremove)](#anchor6)
    1. [追加](#anchor7) 
    1. [削除](#anchor8)
1. [配列のfor文(JSにはいくつか書き方がある)](#anchor9)
1. [リスト内に要素が含まれているか](#anchor10)
1. [リストの中身をシャッフルできない(random.shuffle(list)が使えない)](#anchor11)
pythonで書いていたコードをJSに書き直す作業をした時の備忘録。
今後JS(Vue）を使うことが増えると思うので、忘れないように記録しておきます。

<a id="anchor1"><h2>困ったこと</h2></a>
- Pythonで使えたモジュールがJSでは使えない
- 配列の指定の仕方がめんどくさい

<a id="anchor2"></a>
## 最後の要素を取得する

Python

```Python
array1=[1,2,3,4]
array1[-1] #4
```

JS

```JS
var array1 = [1,2,3,4];
array1[array1.lenght - 1]
```
<a id="anchor3"></a>
## 配列のコピー(参照渡しと値渡しの違い）
<a id="anchor4"></a>
PythonやJavaScriptには、そもそもC++のように参照渡しや値渡しは存在しない言語なので、ここではJavaScriptのsliceについて語ります。

```
const  array1=[1,2,3,4];
const  array = array1.slice();
console.log(array) //[1,2,3,4]
```
以下、コメントでご指摘いただいた内容ですが、Pythonでのcopy()やslice()は浅いコピーなので多次元配列やオブジェクトの配列では変更の影響が及びます。
```
const array1=[[1],[2],[3],[4]];
const array = array1.slice();
array[0][0] = 999
999
> array
[ [ 999 ], [ 2 ], [ 3 ], [ 4 ] ]
> array1
[ [ 999 ], [ 2 ], [ 3 ], [ 4 ] ]
```
<a id="anchor６"></a>
## 配列へ代入と削除（appendとextendとremove)
<a id="anchor7"></a>
### 追加

Python

```python
array1=[1,2,3,4]
array = array1.append([5,6,7]) # [1,2,3,4,[5,6,7]]
array = array1.extend([5,6,7]) # [1,2,3,4,5,6,7]
```

JS

```jsx
array1 = [1,2,3,4
array = array1.push([5,6,7]) // [1,2,3,4,[5,6,7]]
array = array1.concat([5,6,7]) // [1,2,3,4,5,6,7]
```
<a id="anchor8"></a>
### 削除

Python

```Python
array1=[1,2,3,4]
array1.remove(1) #[2,3,4]
```

JS

```jsx
array1 = [1,2,3,4]
var index = array1.findIndex(n => n === 1); //1のindexを探索
array1.splice(index,1) // indexから1個要素を取り除く
```
<a id="anchor9"></a>
## 配列のfor文(JSにはいくつか書き方がある)

Python

```python
array = [1,2,3,4]
for i in array:
	print(i)
```

JS

```jsx
var array = [1,2,3,4];
for (const elem of array) {
  console.log(elem);
}
```

```jsx
const arr = [1,2,3,4];
for (let i = 0; i < arr.length; ++i) {
  console.log(arr[i]);
}
```
<a id="anchor10"></a>
## リスト内に要素が含まれているか

Python

```python
array1=[1,2,3,4]
if 2 in array:
	print('yes') #yes
```

JS

```jsx
var array1 = [1,2,3,4];
if(array1.includes(2)){
console.log('yes')} //yes
```
<a id="anchor11"></a>
## リストの中身をシャッフルできない(random.shuffle(list)が使えない)

Python

```python
list = [[1,2,3,4,5],[6,7],[8,9,10]
random_list = []
for i in list:
	random_list.append(random.shuffle(i)) #[[2,4,5,3,1],[6,7],[9,10,8]]
w = [len(i) for i in random_list]
picked_list = random.choices(random_list, weights=w) #[2,4,5,3,1]
picked_list = [2,4,5,3,1]
picked_num = random.choice(picked_lst) #3
```

JS
```JS
var list = [[1,2,3,4,5],[6,7],[8,9,10];
var random_list = [];
for(let i =0 ;i<list.length;i++){
	random_list.push(this.shuffle(list[i])) //[[2,4,5,3,1],[6,7],[9,10,8]]
}
var picked_index = this.ProbabilisticChoice(random_list); #picked_index = 0
var picked_list = random_list[picked_index] //[2,4,5,3,1]
var picked_num = picked_list[picked_index][Math.floor(Math.random() * picked_list.length)]; // 3

// 単純なシャッフル
function shuffle(array){
    var list = array;
    for (let i=list.length - 1 ;i>=0 ;i--){
        const j = Math.floor(Math.random()*(i+1));
        [list[i],list[j]] = [list[j],list[i]];
    }
    return list
    },
// リストの長いものから取得する関数（重みつけ）
function ProbabilisticChoice(array){
    var lists = array;
    var totalWeight = this.total(array);
    var r = Math.random()*totalWeight;
    var s=0.0;
    for(let j=0;j<lists.length;j++){
        s+=lists[j].length;
        if(r<s){
            return j
        }
    }
}
```