KnockoutJS - Сравнение observableArray с другим observableArray - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть данные в формате 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 ?

1 Ответ

0 голосов
/ 25 апреля 2018

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

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.log(result);

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

...