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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это действительно не имеет ничего общего с нокаутом, это простой алгоритмический вопрос. Учитывая массив объектов и массив «выбранных значений», как я могу отфильтровать первое, используя второе:
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);Теперь применительно к вашему выбиванию, просто прочтите наблюдаемые массивы, как обычно, но используйте тот же алгоритм, что и продемонстрированный выше.
@ Набиль, верно, и это то, что сказано в моем последнем предложении. По сути, там, где у вас // return something using compare, есть именно этот алгоритм.
Мне нужно вернуть наблюдаемые элементы с отфильтрованным содержимым ... не прямое манипулирование данными json ... Я выполняю другие операции, используя эти значения ...