KnockoutJS - Сравнение observableArray с другим observableArray

У меня есть данные json в формате

{
"ITEMS": [
    {
        "option": "one",
        "values": ["A","B","C","D"]
    },
    {
        "option": "two",
        "values": ["E","F","G"]]
    }
]
}

и код скрипта, подобный этому

function Item(data) {
    this.option = ko.observable(data.option);
    this.values = ko.observableArray(data.values);
}

var ProductIndexVM = (function() {
  function ProductIndexVM() {

    items = ko.observable();
    filtered_items = ko.observableArray([]);

    selectedItems = ko.computed(function() {

       return ko.utils.arrayFilter(items(), function(item) { 
        // return something using compare
     });
    });


    // after ajax success
    var mappedItems = $.map(result.ITEMS, function(item) { 
      return new Item(item) 
    });
    items(mappedItems);

  }

  return ProductIndexVM;

})();

После успешного запроса ajax данные были отображены в наблюдаемые элементы.

Проблема в том, что мне нужно сравнить filter_items observableArray с функцией элемента значения observableArray, чтобы, если элементы внутри filter_items совпадают с любой из функций элементов значения, он вернет это или нет.
Упрощая все, я хочу отсортировать элементы, используя только те, которые содержатся в filter_items.

Например, если содержимое filter_items такое же, как показано ниже

["A", "C", "E"]

вывод будет

{
"ITEMS": [
    {
        "option": "one",
        "values": ["A","C"]
    },
    {
        "option": "two",
        "values": ["E"]]
    }
]
}


Как я могу сравнить это внутри selectedItems?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
163
1

Ответы 1

Это действительно не имеет ничего общего с нокаутом, это простой алгоритмический вопрос. Учитывая массив объектов и массив «выбранных значений», как я могу отфильтровать первое, используя второе:

var input = {
  "ITEMS": [
      {
          "option": "one",
          "values": ["A","B","C","D"]
      },
      {
          "option": "two",
          "values": ["E","F","G"]
      }
  ]
}

var filters = ["A","C","E"];

var result = input.ITEMS.map(item => {
   return {
      "option": item.option,
      "values": item.values.filter(value => filters.indexOf(value)>-1)
   }
});

console.info(result);

Теперь применительно к вашему выбиванию, просто прочтите наблюдаемые массивы, как обычно, но используйте тот же алгоритм, что и продемонстрированный выше.

Мне нужно вернуть наблюдаемые элементы с отфильтрованным содержимым ... не прямое манипулирование данными json ... Я выполняю другие операции, используя эти значения ...

Nabil 25.04.2018 18:06

@ Набиль, верно, и это то, что сказано в моем последнем предложении. По сути, там, где у вас // return something using compare, есть именно этот алгоритм.

Jamiec 25.04.2018 18:19

Другие вопросы по теме