fox

Array.prototype.with() とは

`Array.prototype.with()` は、非破壊的に配列の要素を置き換えるためのメソッドです。非破壊的とは、元の配列を変更せずに新しい配列を返すということです。`arr` に対して `with()` を実行しても、`arr` は変更されず、新しい配列のコピーが返されます。

Array.prototype.with() は、非破壊的に配列の要素を置き換えるためのメソッドです。非破壊的とは、元の配列を変更せずに新しい配列を返すということです。下記の例のように、arr に対して with() を実行しても、arr は変更されず、新しい配列のコピーが返されます。

const arr = [1, 2, 3]
// index が 1 の要素を 4 に置き換える
const newArr = arr.with(1, 4)
 
console.log(arr) // [1, 2, 3]
console.log(newArr) // [1, 4, 3]

Array.prototype.with() は Change Array by copy と呼ばれるプロポーサルで提案されたメソッドに 1 つです。Change Array by copy は配列のメソッドに非破壊のメソッドを追加するものです。他にも Array.prototype.srot() の非破壊版である Array.prototype.toSorted() などが提案されています。

このプロポーサルは ECMAScript 2023 に取り込まれています。既に Node.js 20.0.0 で実装されていて使用できます。最新の実装状況は Can I use で確認できます。

使い方

Array.prototype.with() は、第 1 引数に置き換える要素のインデックス、第 2 引数に置き換える値を受け取ります。

arr.with(index, value)

概要でも説明したとおり、with() は非破壊的なメソッドであり、元の配列を変更せずに新しい配列を返します。次のようにメソッドチェインのような使い方もできます。

const arr1 = ['a', 'b', 'c']
const arr2 = arr.with(0, 'A').with(1, 'B').with(2, 'C')
 
console.log(arr1) // ['a', 'b', 'c']
console.log(arr2) // ['A', 'B', 'C']

相対的なインデックス

Array.prototype.with() は、Arrya.prototype.at() のように第 1 引数に相対的なインデックスを指定することもできます。相対的なインデックスとは、配列の末尾からのインデックスのことです。例えば、-1 は配列の末尾の要素を指します。

const arr = ['apple', 'banana', 'orange']
const newArr = arr.with(-1, 'grape')
 
console.log(arr) // ['apple', 'banana', 'orange']
console.log(newArr) // ['apple', 'banana', 'grape']

例外

第 1 引数の配列のインデックスが範囲外の場合、RangeError が発生します。

const arr = [1, 2, 3]
 
arr.with(3, 3)
// Uncaught RangeError: Invalid index : 3

TypedArray

Array.prototype.with() TypedArray のサブクラスでも使用できます。

const arr = new Uint8Array([1, 2, 3])
const newArr = arr.with(1, 4)
 
console.log(arr) // Uint8Array(3) [1, 2, 3]
console.log(newArr) // Uint8Array(3) [1, 4, 3]

参考


Contributors

> GitHub で修正を提案する
この記事をシェアする
はてなブックマークに追加

関連記事