6

こんにちは、JavaScript のサブセットである LIME プログラミングに取り組んでいます。

悲しいことに、配列から特定の要素を削除するには、javascript.splice を使用する必要があります。LIME は splice 関数をサポートしていません。

配列から要素を削除する独自の関数を作成するにはどうすればよいですか?

御時間ありがとうございます。

編集:簡単な関数を作成するために管理します。

function removeElements(array, index)
{
    var tempArray = new Array();
    var counter = 0;

    for(var i = 0; i < array.length; i++)
    {
        if(i != index)
        {
            tempArray[counter] = array[i];
            counter++;
        }
    }
    return tempArray;
}
4

7 に答える 7

7

Array.prototype.splice は ECMA-262 §15.4.4.12 で完全に定義されているため、それを仕様として使用して記述してください。例えば

15.4.4.12 Array.prototype.splice (start, deleteCount [ , item1 [ ,item2 [ , … ] ] )

splice メソッドが 2 つ以上の引数startdeleteCountおよび (オプションで) item1item2などで 呼び出されると、配列インデックスstartで始まる配列のdeleteCount要素は、引数 item1 、 item2 などに置き換えられますArrayオブジェクト削除された要素 (存在する場合) を含む が返されます。次の手順が実行されます。...

おそらく、新しい配列を作成し、メンバーを古い配列から開始するまでコピーし、新しいメンバーを挿入してから、 start + deleteCountから新しい配列の最後までコピーする必要があります。

編集

ここに修正されたスプライスがあります。最初に投稿したものは間違っていました。これは、渡された配列をスプライスし、削除されたメンバーを返します。少し長く見えますが、仕様に近づけるようにして、複雑な Array メソッドやMath.max/minのサポートを想定していません。それらがあれば、かなり単純化できます。

プッシュがサポートされていない場合は、かなり簡単に置き換えることもできます。

function arraySplice(array, start, deleteCount) {
  var result = [];
  var removed = [];
  var argsLen = arguments.length;
  var arrLen = array.length;
  var i, k;

  // Follow spec more or less
  start = parseInt(start, 10);
  deleteCount = parseInt(deleteCount, 10);

  // Deal with negative start per spec
  // Don't assume support for Math.min/max
  if (start < 0) {
    start = arrLen + start;
    start = (start > 0)? start : 0;
  } else {
    start = (start < arrLen)? start : arrLen;
  }

  // Deal with deleteCount per spec
  if (deleteCount < 0) deleteCount = 0;

  if (deleteCount > (arrLen - start)) {
    deleteCount = arrLen - start;
  }

  // Copy members up to start
  for (i = 0; i < start; i++) {
    result[i] = array[i];
  }

  // Add new elements supplied as args
  for (i = 3; i < argsLen; i++) {
    result.push(arguments[i]);
  }

  // Copy removed items to removed array
  for (i = start; i < start + deleteCount; i++) {
    removed.push(array[i]);
  }

  // Add those after start + deleteCount
  for (i = start + (deleteCount || 0); i < arrLen; i++) {
    result.push(array[i]);
  }

  // Update original array
  array.length = 0;
  i = result.length;
  while (i--) {
    array[i] = result[i];
  }

  // Return array of removed elements
  return removed;
}
于 2011-06-29T03:27:48.380 に答える
1

これにより、元の配列が変更され、元の配列と同様に、削除されたアイテムが返されます。

Array.prototype.newSplice = function( start, toRemove, insert ) {
    var remove = this.slice( start, start + toRemove );
    var temp = this.slice(0,start).concat( insert, this.slice( start + toRemove ) );
    this.length = 0;
    this.push.apply( this, temp );
    return remove;
};

比較テスト: http://jsfiddle.net/wxGDd/

var arr = [0,1,2,3,4,5,6,7,8];
var arr2 = [0,1,2,3,4,5,6,7,8];


console.log( arr.splice( 3, 2, 6 ) );      // [3, 4]
console.log( arr );      // [0, 1, 2, 6, 5, 6, 7, 8]

console.log( arr2.newSplice( 3, 2, 6 ) );  // [3, 4]
console.log( arr2 );     // [0, 1, 2, 6, 5, 6, 7, 8]

少し余分な詳細作業が必要になる場合がありますが、ほとんどの場合、それを処理します。

于 2011-06-29T03:33:54.253 に答える
1

Array.prototype.splice が消えた場合の簡単な実装を次に示します。

if (typeof Array.prototype.splice === 'undefined') {
    Array.prototype.splice = function (index, howmany, elemes) {
        howmany = typeof howmany === 'undefined' || this.length;
        var elems = Array.prototype.slice.call(arguments, 2), newArr = this.slice(0, index), last = this.slice(index + howmany);
        newArr =  newArr.concat.apply(newArr, elems);
        newArr =  newArr.concat.apply(newArr, last);
        return newArr;
    }
}
于 2011-06-29T03:29:47.930 に答える
0

LIME の Array 実装に欠けている他のメソッドはありますか?

少なくとも最も基本的なものが利用可能であると仮定すると、push()それindexOf()を行う方法がいくつかあります。これがどのように行われるかは、これが破壊的な方法であるか、新しい配列を返す必要があるかによって異なります。標準的な方法と同じ入力を仮定するとsplice(index, howMany, element1, elementN):

  1. という名前の新しい配列を作成しますnew
  2. push()インデックス 0 からindex配列new
  3. LIME が標準変数をサポートしている場合は、index > 2 でループスルーできます。それ以外の場合は、可変数のパラメーターの代わりに配列を渡す必要がありますindexpush()argumentsarguments
  4. 新しいオブジェクトを挿入した後、入力配列の要素をループし続けますindex + howManyinput.length

あなたが求めている結果が得られるはずだと私は信じています。

于 2011-06-29T03:27:03.640 に答える