web-dev-qa-db-ja.com

JavaScriptで配列の長さを制限できますか?

製品の閲覧履歴を表示したいので、ブラウザCookieに製品IDを保存しています。

履歴のリストは5項目に制限されているため、Cookieの値を配列に変換し、その長さを確認して冗長性を削減します。

以下のコードは私が試したものですが、動作しません。配列項目は削除されません。

配列の長さを制限して、5つのアイテムのみを保存できるようにする方法を教えてください。

または

配列インデックス4の後にアイテムをカットするにはどうすればよいですか?

var id = product_id;
var browseHistory = $.cookie('history');
if (browseHistory != null) {
  var old_cookie = $.cookie('history');
  var new_cookie = '';

  if (old_cookie.indexOf(',') != -1) {
    var arr = old_cookie.split(',');
    if (arr.length >= 5) {
      arr.splice(4, 1)
    }
  }

  new_cookie = id + ',' + old_cookie;
  $.cookie('history', new_cookie, { expires: 7, path: '/' });
} else {
  $.cookie('history', id, { expires: 7, path: '/' });
}
40
Charles Yeung

スプライスを正しく使用していません:

arr.splice(4, 1)

これにより、インデックス4の1つのアイテムが削除されます。 here を参照してください。

slice を使用したいと思います。

arr.slice(0,5)

これにより、位置0〜4の要素が返されます。

これは、残りのすべてのコード(Cookieなど)が正しく機能することを前提としています

63
arr.length = Math.min(arr.length, 5)
16
justspamjustin

最速 で最も簡単な方法は、.lengthプロパティを目的の長さに設定することです。

arr.length = 4;

これは、配列をリセット/空にする望ましい方法でもあります。

arr.length = 0;

警告:このプロパティを設定すると、配列をより長くすることもできます:長さが2の場合、arr.length = 4を実行すると、2つのundefined個のアイテム。おそらく条件を追加します:

if (arr.length > 4) arr.length = 4;

代わりに:

arr.length = Math.min(arr.length, 4);
13
fregante
var  arrLength = arr.length;
if(arrLength > maxNumber){
    arr.splice( 0, arrLength - maxNumber);
}

このsoultionは、p5jsのような動的な環境でうまく機能します。これを描画呼び出し内に配置すると、配列の長さが動的にクランプされます。

の問題:

arr.slice(0,5)

...それは、描画フレームごとに配列から一定数のアイテムを取り出すだけであり、ユーザーが複数のアイテムを追加できる場合、配列サイズを一定に保つことができないことです。

の問題:

if (arr.length > 4) arr.length = 4;

...配列の最後から項目を取得するため、Push()で最後に追加する場合でも配列を循環しません。

3
Luche

アイテムを削除した後、実際には短縮された配列を使用する必要があります。短縮された配列を無視しています。

Cookieを配列に変換します。配列の長さを短くしてから、その短縮配列を使用しないでください。代わりに、古いCookie(短縮されていないCookie)を使用します。

短縮配列を.join(",")を使用して文字列に変換し直し、短縮されていない_old_cookie_を使用する代わりに新しいCookieに使用する必要があります。

また、.splice()を正しく使用していない可能性もありますが、配列を短縮する目的が正確にはわかりません。 .splice()here の正確な関数について読むことができます。

1
jfriend00