knockoutJS를 사용하는 태그 지정 시스템을 사용하는 목록 시스템에서 작업하고 있습니다. 아이디어는 다른 태그와 여러 목록을 한 후 어떤 일치를 표시하는 태그 (0, 1 이상의 태그) 각각 나름대로의효율적으로 모든 일치 항목을 찾는 방법 및 하나의 배열을 다른 배열과 비교하는 일치 없음
-
'항목'의 중심 목록이 있습니다. 예를 들어
: -
item 1 - tags 1,3
item 2 - tags 2,4
item 3 - tags 4
item 4 - tags NONE
시스템, 항목을 선택하는 '더리스트'(대한 '태그가'하나 하나에 의해 생성 된
List 1 - tags 1,2
List 2 - tags 3
플러스 2 추가 목록 목록과 일치하지 않는 태그 및 항목 없음).
에이 초래 : - 나는 각 목록에서 개최 된 항목을 여러 루프를 실행하고 재설정하고있는 순간으로 나는 데 문제가 목록에 항목을 정렬하는 효율적인 방법입니다
List NO TAGS = item 4
List NO LIST = item 3
List 1 = item 1, item 2
List 2 = item 1
변경 될 때마다
아래의 코드는 내가 아는 추한, 그것은 참조를 위해 더, 나는 질문이 바닥
UGLY WORKING 예
에 표시된 데이터 구조에 태그를 비교하는 가장 효율적인 방법이 무엇인지 가정하자ko.computed(function() {
//clear all items in arrays
ko.utils.arrayForEach(self.lists(), function (list) {
list.items([]);
});
var onList; //does this item appear on a list yet
//loop through all items and then all lists to see if an item matches any tags on that list and if so add it.
ko.utils.arrayForEach(self.items(), function (item) {
onList = 0; //reset whether found - used for adding to 'No List'
ko.utils.arrayForEach(self.lists(), function (list) {
//if an item has no tasks then add to list id - 2 'No Tags' List
if (item.tags().length == 0 && list.id() == -2) {
list.items.push(item);
onList = 1; //found a list
} else {
//now for each item loop through tags and then loop through lists tags and find any matches
ko.utils.arrayFirst(item.tags(), function (tag) {
var found = 0;
ko.utils.arrayFirst(list.tags(), function (listTag) {
console.log(listTag, tag);
if (parseInt(listTag) == parseInt(tag)) {
list.items.push(item);
found = 1;
onList = 1;
//at least one tag matches, so exit
return 1;
}
});
if (found == 1) {
//at least one tag matches, so exit
return 1;
}
});
}
});
//there were no matches in any of the lists so add this to the list 'No List'
if(onList == 0 && self.lists().length > 1){
self.lists()[1].items.push(item);
}
});
});
데이터 구조
///4 lists - the first 2 are system generated 'catch' lists
var listData = [
{id: -2, name: "NO TAGS", tags: [
//NOT APPLICABLE AS HANDLED BY CODE
]
},
{id: -1, name: "NO LIST", tags: [
//NOT APPLICABLE AS HANDLED BY CODE
]
},
{id: 1, name: "List 1", tags: [
2
]
},
{id: 2, name: "List 2", tags: [
1, 3
]
}
];
//2 sets of items
var itemData = [
{id: 1, name: "Item 1", addedBy: 1, tags: [
1
]},
{id: 2, name: "Item 2", addedBy: 1, tags: [
2, 3
]}
];
아마도 코드를 더 빨리 작동시키는 가장 좋은 방법은'deferUpdates = true'를 사용하는 것입니다. –
방금 프로젝트를 KO3.4로 업그레이드했는데이 질문에 관심이있는 대부분의 이유는 다음을위한 deferUpdates에 대해 배우는 것이 었습니다. 자기. 오늘의 일은 내 앱에서 시도하는 것입니다. – sifriday
자세한 답변을 기다려 주셔서 대단히 감사합니다. 지연된 업데이트가 이미 적용되어 있으며, 귀하의 의견을 게시했으며 이번 주말에 작업 할 예정입니다. 나는 명백한 알고리즘이 빠져 있는지 궁금해했다.하지만 나는 당신의 요점으로 생각하기에 속도를 늦추고 시작할 수있을만큼 의지 만 생각할 수있다. 나중에 다른 구조로 다시 작성하고 싶지 않았다. +1 그리고 나는 약간의 포인트를 얻을 수 있도록 받아 들일 것이다 :-) –