Jquery: расширение массива в каждом цикле - PullRequest
0 голосов
/ 12 января 2020

Я фильтрую массив в Jquery в зависимости от выбора пользователем некоторых кнопок. Я использую oop возможности и создаю массив «result», расширяя его с помощью фрагмента «original_array».

result = []
$.each(university_selection, function(index, value) {
     if ($(value).attr('name') == 'on') {
          partial = jQuery.grep(original_array, function(n) { return ( n.institucion == $(value).text()); });
          result = $.extend( result , partial )
     };
});

Filterign работает нормально, но вместо этого команда "extend" заменяет предыдущий экземпляр "накопления". Я получаю только последний возвращенный фрагмент.

Я думаю, это как-то связано с моментом, когда "result = $ .extend (result, part)" сохраняется в памяти.

Любые подсказки?

Ответы [ 2 ]

1 голос
/ 12 января 2020

Чтобы настроить jQuery, вы можете добавить sh каждый элемент в partial до result:

result.push(...partial);

или

result = result.concat(partial)

Но общий код является довольно многословным, не очень функциональным и более сложным в вычислительном отношении, чем должно быть.

Чтобы уменьшить вычислительную сложность с O(n^2) до O(n), создайте набор значений on, затем .filter original_array в зависимости от того, включено ли свойство institucion. Логика c, вероятно, будет намного понятнее:

const selectedValues = new Set(
  [...university_selection]
    .filter(elm => elm.name === 'on')
    .map(elm => elm.textContent)
);
const result = original_array.filter(item => selectedValues.has(item.institucion));

Таким образом, вы только итерируете по original_array один раз, и простой .filter создает массив result на основе простого условия.

0 голосов
/ 12 января 2020

Я мог бы решить проблему, используя

result = result.concat( partial );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...