javascript - 順番 - 特定のインデックスの配列にアイテムを挿入するにはどうすればいいですか?




javascript 配列 連想配列 変換 (8)

カスタム配列のinsertメソッド

1.複数の引数と連鎖サポート

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

Array.prototype.insert = function(index) {
    this.splice.apply(this, [index, 0].concat(
        Array.prototype.slice.call(arguments, 1)));
    return this;
};

複数の要素を挿入することができ(ネイティブspliceように)、チェーンをサポートします:

["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6);
// ["b", "X", "Y", "Z", "c"]

2.配列型引数のマージと連鎖サポート

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

Array.prototype.insert = function(index) {
    index = Math.min(index, this.length);
    arguments.length > 1
        && this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))
        && this.insert.apply(this, arguments);
    return this;
};

指定された配列の引数から配列をマージでき、連鎖もサポートしています:

["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-");
// "a-b-V-W-X-Y-Z-c-d"

デモ: http://jsfiddle.net/UPphH/ : http://jsfiddle.net/UPphH/

私はJavascriptの配列の挿入メソッドを探しています:

arr.insert(index, item)

jQueryの方が望ましいですが、現時点ではJavascriptの実装が行います。


Array.insertようにして、 Array.insertメソッドを実装できます。

Array.prototype.insert = function ( index, item ) {
    this.splice( index, 0, item );
};

次に、次のように使用できます。

var arr = [ 'A', 'B', 'D', 'E' ];
arr.insert(2, 'C');

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]

この場合純粋なJavaScriptを使用することをお勧めします 。また、JavaScriptには挿入メソッドもありませんが、私たちはあなたのために仕事をする組み込みのArrayメソッドであるメソッドを持っています。

splice()を見てみましょう...

splice()メソッドは、既存の要素を削除したり、新しい要素を追加したりして、配列の内容を変更します。

OK、次の配列があるとします:

const arr = [1, 2, 3, 4, 5];

私たちはこのように3を取り除くことができます:

arr.splice(arr.indexOf(3), 1);

それは3を返しますが、arrを確認すると、次のようになります。

[1, 2, 4, 5]

これまでのところ、とても良いですが、スプライスを使って配列に新しい要素を追加する方法はありますか? 3つを元に戻しましょう...

arr.splice(2, 0, 3);

私たちが何をしたのか見てみましょう...

スプライスをもう一度使用しますが、今回は2番目の引数に0を渡し、項目を削除しないことを意味しますが、3番目の引数は3番目の引数を2番目のインデックスに追加します

同時に削除して追加することができます。たとえば、次のようにすることができます。

arr.splice(2, 2, 3);

インデックス2の2つのアイテムが削除され、インデックス2に3が追加され、結果は次のようになります。

[1, 2, 3, 5];

これはスプライスの各項目がどのように動作するかを示しています:

array.splice(start、deleteCount、item1、item2、item3 ...)


これはすでに答えられていますが、別の方法としてこのメ​​モを追加しています。

私は定義された順序で並べることが保証されていない「連想配列」(すなわちオブジェクト)から抜け出すので、 既知の数の項目を特定の位置に配列に配置したかったのです。 私は結果の配列をオブジェクトの配列にしたいが、配列は配列が特定の順序であることを保証しているので、オブジェクトは配列内の特定の順序になるようにしたい。 だから私はこれをやった。

まずソースオブジェクト、PostgreSQLから取得したJSONB文字列。 私はそれを各子オブジェクトの "order"プロパティでソートしたかったのです。

var jsonb_str = '{"one": {"abbr": "", "order": 3}, "two": {"abbr": "", "order": 4}, "three": {"abbr": "", "order": 5}, "initialize": {"abbr": "init", "order": 1}, "start": {"abbr": "", "order": 2}}';

var jsonb_obj = JSON.parse(jsonb_str);

オブジェクト内のノードの数が分かっているので、まず指定された長さの配列を作成します。

var obj_length = Object.keys(jsonb_obj).length;
var sorted_array = new Array(obj_length);

そして、オブジェクトを反復処理して、実際には「並べ替え」が行われることなく、新しく作成された一時オブジェクトを配列の目的の場所に配置します。

for (var key of Object.keys(jsonb_obj)) {
  var tobj = {};
  tobj[key] = jsonb_obj[key].abbr;

  var position = jsonb_obj[key].order - 1;
  sorted_array[position] = tobj;
}

console.dir(sorted_array);

スプライス以外にも、元のアレイに変更を加えることなく、追加されたアイテムで新しいアレイを作成するこの方法を使用することができます。 可能であれば、通常突然変異を避けるべきです。 ここではES6スプレッド演算子を使用しています。

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, newItem) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted item
  newItem,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10)

console.log(result)
// [1, 10, 2, 3, 4, 5]

これは、新しいアイテムに対して残りの演算子を使用するために関数を少し微調整して複数のアイテムを追加し、返された結果にそれを広げるためにも使用できます

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, ...newItems) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted items
  ...newItems,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10, 20)

console.log(result)
// [1, 10, 20, 2, 3, 4, 5]


一度に複数の要素を配列に挿入したい場合は、このスタックオーバーフローの答えをチェックしてください: 配列を配列にスプライスするより良い方法はjavascript

両方の例を説明するための関数もいくつかあります:

function insertAt(array, index) {
    var arrayToInsert = Array.prototype.splice.apply(arguments, [2]);
    return insertArrayAt(array, index, arrayToInsert);
}

function insertArrayAt(array, index, arrayToInsert) {
    Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
    return array;
}

最後にjsFiddleがありますので、あなた自身のためにそれを見ることができます: http://jsfiddle.net/luisperezphd/Wc8aS/ ://jsfiddle.net/luisperezphd/Wc8aS/

そして、これはあなたが関数を使う方法です:

// if you want to insert specific values whether constants or variables:
insertAt(arr, 1, "x", "y", "z");

// OR if you have an array:
var arrToInsert = ["x", "y", "z"];
insertArrayAt(arr, 1, arrToInsert);

私はこれを試して、それは正常に動作しています!

var initialArr = ["India","China","Japan","USA"];
initialArr.splice(index, 0, item);

インデックスは、要素を挿入または削除する位置です。 0つまり、2番目のパラメータは、削除するインデックスの要素の数を定義します。配列に入れたい新しいエントリです。 それは1つ以上であってもよい。

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");

関数プログラミングと連鎖を適切に行うには、 Array.prototype.insert()発明が不可欠です。 完全に意味のない空の配列ではなく、変異した配列を返した場合、スプライスは完全であった可能性があります。 だからここに行く

Array.prototype.insert = function(i,...rest){
  this.splice(i,0,...rest)
  return this
}

var a = [3,4,8,9];
document.write("<pre>" + JSON.stringify(a.insert(2,5,6,7)) + "</pre>");

Array.prototype.splice()上記のように元の配列を変更し、 "あなたに属していないものを変更しないでください"というような不平を言うかもしれません。 だから公共の福祉私は元の配列を変更しない別のArray.prototype.insert()を提供したいと思います。 ここにそれは行く;

Array.prototype.insert = function(i,...rest){
  return this.slice(0,i).concat(rest,this.slice(i));
}

var a = [3,4,8,9],
    b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));





insert