在JavaScript中仅向数组添加唯一对象

S16*_*S16 17 javascript arrays sorting json underscore.js

让我们说我从这开始:

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"
                            }];
Run Code Online (Sandbox Code Playgroud)

我使用它来预填充表格.用户可以编辑条目或添加新条目.我需要阻止他们添加重复项.

问题是我正在序列化的表单的结构以及从数据库返回这些值的顺序是不一样的,所以我有可能使用以下格式将项插入到此数组中:

                            {
                                "country": "US",
                                "firstname": "Kevin",
                                "lastname": "Borders",
                                "address1": "2201 N Pershing Dr",
                                "address2": "Apt 417",
                                "zip": "22201",                                    
                                "city": "Arlington",
                                "state": "VA"
                            }
Run Code Online (Sandbox Code Playgroud)

这与第一个条目相同,只是以不同方式排序.

我正在加载underscorejs,所以如果有办法用那个库来处理它会很棒.我也在使用jQuery,如果有帮助的话.

在这一点上,我不知道如何继续.

Ber*_*rgi 28

下划线findWhere功能不正是你所需要的-这不是一个indexOf按对象身份搜索,但搜索的对象,其属性具有与输入相同的值.

if (_.findWhere(shippingAddresses, toBeInserted) == null) {
    shippingAddresses.push(toBeInserted);
}
Run Code Online (Sandbox Code Playgroud)

  • 由于宽松的比较`==`,但是`_.findWhere`必须针对`undefined`而不是`null`进行测试,这个代码行为正确(根据[underscore.js docs](http://underscorejs.org/#) findWhere)). (2认同)
  • @Physiocoder:正是我的意图:-)当然,如果你更喜欢的话,你也可以使用 `=== undefined` 。 (2认同)

vsy*_*ync 15

使用lodash union方法的基本示例:

var a = [1,2,3];

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

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

虽然这并没有直接回答这个问题,但它确实回答了如何为数组添加唯一值的更广泛的问题,而像我一样,其他人可能会从谷歌这个页面上绊倒.


Ash*_*eri 5

基于这个答案:“js-remove-an-array-element-by-index-in-javascript”

/sf/answers/500003661/

我使用以下简洁的习惯用法,不需要 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)
Run Code Online (Sandbox Code Playgroud)

更一般地说,它会

position = myArray.indexOf(myval)
unless ~position
  myArray.push myVal
Run Code Online (Sandbox Code Playgroud)

或者在JS中

var position;

position = myArray.indexOf(myval);

if (!~position) {
  myArray.push(myVal);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你用 JS 而不是 CoffeeScript 回答,也许你可能会获得更多的赞成票,因为这个问题明确询问了如何用 JS 来做这件事:) (3认同)