Добавлять только уникальные объекты в массив в JavaScript - программирование
Подтвердить что ты не робот

Добавлять только уникальные объекты в массив в JavaScript

Допустим, я начну с этого:

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, если это поможет.

На данный момент я не уверен, как поступить.

4b9b3361

Ответ 2

Базовый пример использования метода 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);
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>

Ответ 3

на основе этого ответа: "js-remove-a-array-element-by-index-in-javascript"

fooobar.com/questions/14280/...

Я использую следующую идиому, которая краткая и не требует underscore.js или любой другой структуры.

Вот пример записи выбранных и невыбранных строк для плагина jQuery DataTables. Я сохраняю массив выбранных в настоящее время идентификаторов, и я не хочу приводить дубликаты в массиве:

в coffeescript

  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);
}

Ответ 4

EDIT, это будет работать с вашим примером несортированных свойств:

var normalized_array = _.map(shippingAddresses, function(a){ 
      var o = {}; 
      _.each(Object.keys(shippingAddresses[0]), function(x){o[x] = a[x]});
      return o;
})
var stringy_array = _.map(normalized_array, JSON.stringify);
shippingAddresses = _.map(_.uniq(stringy_array), JSON.parse});

и мы могли бы сделать это с помощью однострочного, но это было бы очень уродливо:

shippingAddresses_uniq = _.map(_.uniq(_.map(_.map(shippingAddresses, function(a){ var o = {}; _.each(Object.keys(shippingAddresses[0]), function(x){o[x] = a[x]}); return o; }), JSON.stringify)), JSON.parse});

Ответ 5

Если вы хотите проверить входной объект пользователя, вы можете попробовать эту функцию:

var uniqueInput = {
                       "country": "UK",
                       "firstname": "Calvin",
                       "lastname": "Borders",
                       "address1": "2201 N Pershing Dr",
                       "address2": "Apt 417",
                       "city": "Arlington",
                       "state": "VA",
                       "zip": "22201"

                        };

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

                        };

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"
                        }];

function checkDuplication(checkTarget,source){
    _.each(source,function(obj){
        if(_.isEqual(checkTarget,obj)){ 
            alert("duplicated");
        }
    });
}

И попробуйте вызвать эту функцию проверки в разных параметрах (uniqueInput и duplicatedInput) Я думаю, что он мог проверить ввод дублирования в ваших почтовых адресах.

checkDuplication(uniqueInput,shippingAddresses);
checkDuplication(duplicatedInput,shippingAddresses);

Я делаю jsfiddle. Вы можете попробовать. Надеюсь, это поможет вам.

Ответ 6

Базовый пример использования Set() из ECMAScript 2015 (библиотека не требуется)

Объект Set позволяет хранить уникальные значения любого типа (будь то примитивные значения или ссылки на объекты). Если передается итеративный объект, все его элементы будут добавлены в новый Set. Здесь я просто добавлю одно значение:

// Use Set to remove duplicate elements from the array 
// and keep your new addition from causing a duplicate
const numbers = [1, 1, 1, 2, 3, 100]

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

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