2013-03-18 75 views
3

我希望比較2個可觀察陣列。我已經定義了2個可觀察陣列,如下所示比較具有不同元素的可觀察陣列

var data1 = [{name1: "one"}, {name1: "two"}, {name1: "three"}]; 
var data2 = [{name2: "one"}, {name2: "two"}, {name2: "three"}]; 

dataOne: ko.observableArray(data1), 
dataTwo: ko.observableArray(data2) 

您可以看到data1的元素名稱不同於data2。我希望比較2個可觀察數組並返回彼此匹配的數據。所以在我們的情況下,它將是「兩」和「三」

在這樣做後,我會將此綁定到複選框,將複選框設置爲與匹配數據複選框。我已經把小提琴here

我想綁定複選框與可觀察數組dataTwo的值。如何實現這一目標?

忘了提及,在我的小提琴中,我只有一個複選框,但在我的實際情況下,它將被多個複選框綁定到數據。


我現在已經更新了小提琴。你可以看到我的綁定複選框爲dataOne,但希望根據datatwo中的元素進行檢查。

回答

2

我不得不承認,我還是很困惑,你在這裏試圖達到什麼目的。我建議你預處理這兩個數組以產生一個包含兩個數組中的值的數組。然後,當您遍歷每個數組時,您可以查看當前值是否在重複列表中,如果是,則選中該複選框。

首先,添加一個可觀察的陣列到您的ViewModel:

duplicates: ko.observableArray() 

可以使用扁平每個陣列:

var flattenedOne = ko.utils.arrayMap(this.dataOne(), function(item) { 
    return item.name1; 
}); 
flattenedOne = flattenedOne.sort(); 

var flattenedTwo = ko.utils.arrayMap(this.dataTwo(), function(item) { 
    return item.name2; 
}); 
flattenedTwo = flattenedTwo.sort(); 

然後用比較來獲得那些在兩個數組:

var differences = ko.utils.compareArrays(viewModel.flattenedOne, viewModel.flattenedTwo); 
//return a flat list of differences 
ko.utils.arrayForEach(differences, function(difference) { 
    if (difference.status === 'retained') { 
     viewModel.duplicates.push(difference.value); 
    } 
}); 

那麼你的數據綁定使用:

<input type="checkbox" data-bind="checked: duplicates.indexOf(name1) !== -1" /> 

工作fiddle

+0

如果我引起混淆,我很抱歉。我已經更新小提琴再次根據您的代碼http://jsfiddle.net/Jq3ru/35/ 我想要的是,我的複選框將綁定到「dataOne」,但它將根據匹配值與「dataTwo」我仍然無法得到它檢查。在我們的例子中,現在將檢查2個複選框,因爲只有兩個數據匹配,即「兩個」和「三個」。現在希望它清楚。 – DevelopmentIsMyPassion 2013-03-19 09:10:58

+0

昨天晚上我確實把小提琴放在了一起,它確實奏效。它在我的家用電腦上,所以我不能在這裏發佈。我會盡快查看您的更新。 – 2013-03-19 09:14:38

+0

更新你的小提琴,並更新答案。 – 2013-03-19 09:20:16