20

私がこれから始めるとしましょう:

var shippingAddresses = [
    {
      "firstname": "Kevin",
      "lastname": "Borders",
      "address1": "2201 N Pershing Dr",
      "address2": "Apt 417",
      "city": "Arlington",
      "state": "VA",
      "zip": "22201",
      "country": "US"
    }, 
    {
      "firstname": "Dan",
      "lastname": "Hess",
      "address1": "304 Riversedge Dr",
      "address2": "",
      "city": "Saline",
      "state": "MI",
      "zip": "48176",
      "country": "US"
    }
]

これを使用して、フォームに事前入力します。
ユーザーはエントリを編集したり、新しいエントリを追加したりできます。重複を追加しないようにする必要があります。

問題は、シリアル化しているフォームの構造と、これらの値がデータベースから返される順序が同じではないため、次の形式でこの配列にアイテムを挿入する可能性があることです。

{
  "country": "US",
  "firstname": "Kevin",
  "lastname": "Borders",
  "address1": "2201 N Pershing Dr",
  "address2": "Apt 417",
  "zip": "22201",                                    
  "city": "Arlington",
  "state": "VA"
}

これは最初のエントリと同じですが、順序が異なります。

私はunderscorejsをロードしているので、そのライブラリでそれを処理する方法があればそれは素晴らしいことです. それが役立つ場合は、jQueryも使用しています。

この時点で、どのように進めればよいかわかりません。

4

7 に答える 7

30

UnderscorefindWhere関数はまさに必要なことを行います。オブジェクト ID による検索ではなく、indexOfプロパティが入力値と同じ値を持つオブジェクトを検索します。

if (_.findWhere(shippingAddresses, toBeInserted) == null) {
    shippingAddresses.push(toBeInserted);
}
于 2013-06-27T19:03:15.557 に答える
16

lodash ユニオンメソッドを使用した基本的な例:

var a = [1,2,3];

// try to add "1" and "4" to the above Array
a = _.union(a, [1, 4]);

console.log(a);
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>

これは質問に直接答えるものではありませんが、配列に一意の値を追加する方法に関するより広範な質問に答えます。私のように、他の人はグーグルからこのページに出くわすかもしれません.

于 2016-07-17T22:18:08.127 に答える
5

この回答に基づいて: "js-remove-an-array-element-by-index-in-javascript"

https://stackoverflow.com/a/7142909/886092

簡潔で、underscore.js やその他のフレームワークを必要としない次のイディオムを使用しています。

以下は、DataTables jquery プラグインの選択および選択解除された行を記録する例です。現在選択されている ID の配列を保持していますが、配列内で重複してしまいたくありません。

コーヒースクリプトで

  fnRowSelected: (nodes) ->
    position = $selected.indexOf(nodes[0].id)
    unless ~position
      $selected.push nodes[0].id
    return
  fnRowDeselected: (nodes) ->
    position = $selected.indexOf(nodes[0].id)
    if ~position
      $selected.splice(position, 1)

より一般的には

position = myArray.indexOf(myval)
unless ~position
  myArray.push myVal

またはJSで

var position;

position = myArray.indexOf(myval);

if (!~position) {
  myArray.push(myVal);
}
于 2014-02-10T17:06:36.293 に答える
1

これが必要だと思います、

注: ライブラリは必要ありません。

let array = [{ id: 1}, {id: 2}, {id: 3}];

function addUniqeObj(data) {
  let index = -1;

  for(let i = 0, i < array.length; i++) {
    if(array[i].id === data.id) {
      index = i;
    }
  }

  if(index > -1) {
    array[index] = data;
  } else {
    array.push(data)
  }

}
于 2020-04-14T16:08:49.647 に答える
-1

ECMAScript 2015 から使用する基本的な例Set()(ライブラリは不要)

オブジェクトを使用すると、任意のタイプの一意の値を格納できます(Setプリミティブ値またはオブジェクト参照のいずれか)。反復可能なオブジェクトが渡された場合、そのすべての要素が new に追加されSetます。ここでは、値を 1 つだけ追加します。

// original array with duplicates already present
const numbers = [1, 1, 1, 2, 3, 100]

// Use Set to remove duplicate elements from the array 
// and keep your new addition from causing a duplicate.

// New value (100) is not added since it exists (and array 
// also is de-duped)
console.log(Array.from(new Set([...numbers, 100])))
// [1, 2, 3, 100]

// New, non-existing value (101) is added (and array is de-duped)
console.log(Array.from(new Set([...numbers, 101])))
// [1, 2, 3, 100, 101]

于 2019-02-13T22:32:11.123 に答える