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つの観測可能な配列を比較し、互いに一致するデータを返したいと思います。したがって、私たちの場合は「2」と「3」になります

これを行った後、これをチェックボックスにバインドします。これにより、チェックボックスが一致するデータのチェックボックスに設定されます。ここにフィドルを立てました

チェックボックスを監視可能な配列dataTwoの値にバインドしたいと思います。これを達成する方法は?

私のフィドルにはチェックボックスが1つしかないことを忘れましたが、実際のシナリオでは、データにバインドされる複数のチェックボックスになります。


フィドルを更新しました。チェックボックスをdataOneにバインドしているが、datatwoの要素に基づいてチェックしたいことがわかります。

4

1 に答える 1

2

認めざるを得ませんが、あなたがここで何を達成しようとしているのかについて、私はまだかなり混乱しています。2 つの配列を前処理して、両方の配列にある値を含む 1 つの配列を生成することをお勧めします。次に、各配列をループしているときに、現在の値が重複のリストにあるかどうかを確認し、重複している場合はボックスをオンにします。

まず、監視可能な配列を 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();

次に、compare を使用して、両方の配列にあるものを取得します。

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" />

ワーキングフィドル

于 2013-03-18T22:26:54.920 に答える