Уникальный массив по свойству объекта

0

Как сделать массив объектов уникальным на основе свойства? В этом случае "поле":

0: Object
field: "name"
operator: "eq"
value: "d"

1: Object
field: "gridSearch"
operator: "contains"
value: "1"

2: Object
field: "gridSearch"
operator: "contains"
value: "12"

Для справки здесь бит кода, который я использую, когда эта проблема касается:

$('#gridSearch').keyup(function() {
    var currentFilters = $('.k-grid').data("kendoGrid").dataSource.filter();

    currentFilters.filters.push({
        field: 'gridSearch',
        operator: 'contains',
        value: $(this).val()
    })

    console.log(currentFilters.filters)
})
  • 0
    Что вы имеете в виду make an array of objects unique ? И в чем проблема?
  • 0
    @Daniel Я имею в виду "Как сделать массив объектов уникальным на основе свойства?"
Теги:
arrays
kendo-ui
kendo-grid

2 ответа

0
Лучший ответ

Вы можете использовать jQuery.extend для этого; поскольку вы хотите использовать это для Kendo Grid, возможно, вы могли бы сделать что-то вроде этого (пример работает только для фильтров без вложенности):

kendo.ui.Grid.fn.addOrUpdateFilter = function (filter) {
    var filterConfig = this.dataSource.filter(),
        filters,
        isNewFilter = true;

    if (filterConfig) {
        filters = filterConfig.filters;
        for (var i = 0; i < filters.length; i++) {
            if (filters[i].field === filter.field) {
                // there already was a filter for this field, so update it
                $.extend(filters[i], filter);
                isNewFilter = false;
            }
        }
    } else {
        filters = [];
    }

    // there was no filter for this field, so add it
    if (isNewFilter) {
        filters.push(filter);
    }

    this.dataSource.filter(filters);
}

поэтому вы можете сделать это в своем обработчике:

$('#gridSearch').keyup(function() {
    var grid = $('.k-grid').first().data("kendoGrid");

    grid.addOrUpdateFilter({
        field: 'gridSearch',
        operator: 'contains',
        value: $(this).val()
    });
})
  • 0
    Вскоре я понял, что мой метод не работает, потому что если вы сначала выполните поиск, то отфильтруете массив. Спасибо!
0

Если я правильно ее понимаю, вы хотите определить метод, чтобы при нажатии новых элементов он еще не существует. Мне кажется, что вам нужно добавить еще один шаг:

var addUniqueElement = function(arr, el) {
   for(var i = 0; i < arr.length; i++) {
      if(arr[i].field == el.field)
         return false; // This element already exists
   }
   // Element didn't already exist in the array
   arr.push(el);
   return true;
}

Тогда все, что вам нужно сделать, это вызвать addUniqueElement, а не нажимать его самостоятельно.

  • 0
    Необходимо перезаписать любые существующие элементы, чтобы возвращаемый массив имел самое новое значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню