2016-08-12 3 views
-1

私はKnockout.jsで作業しています。KnockOut.JSは2つの配列を比較し、2番目の配列から一意の値を削除します

var chosenFruit = ko.observableArray([]); 
var allFruits = ko.observableArray([]); 

allFruits  =  [ "Apple" , "Bananna" , "Grapes" , "Oranges"] 
chosenFruit  =  ["Apple" , "Bananna" , "kiwi"] 

、「キウイ」は(allFruitsであることを意味、)最初の配列には存在しないので、私は二番目の配列(chosenFruit)から「キウイ」を削除します。

私は両方の配列を比較し、2番目の配列から削除したい - 最初の配列に存在しない値。意味

、比較した後、二番目の配列は次のようになります。

chosenFruit =  ["Apple" , "Bananna"] 

これを実現する方法を提案してください。

ありがとうございました!

+3

あなたがしようとしているものを入力してください。 –

答えて

1

使用Array#filter方法

var allFruits = ["Apple", "Bananna", "Grapes", "Oranges"], 
 
    chosenFruit = ["Apple", "Bananna", "kiwi"]; 
 

 
console.log(
 
    // iterate and filter out element 
 
    chosenFruit.filter(function(v) { 
 
    // check value present in array 
 
    return allFruits.indexOf(v) > -1; 
 
    }) 
 
)


UPDATE 1:あなたは要素を除去するための参照使用Array#spliceを維持したい場合。

var allFruits = ["Apple", "Bananna", "Grapes", "Oranges"], 
 
    chosenFruit = ["Apple", "Bananna", "kiwi"]; 
 
// store length for iterating 
 
var i = chosenFruit.length; 
 

 
// iterate upto `0` 
 
while (i--) { 
 
    // check value exist in array 
 
    if (allFruits.indexOf(chosenFruit[i]) == -1) { 
 
    // if not present then remove it 
 
    chosenFruit.splice(i, 1); 
 
    } 
 
} 
 

 

 
console.log(chosenFruit);


UPDATE 2: ノックアウトでフィルタ処理された新しい配列を生成Array#filterを使用して、このような何かを。

var chosenFruit = ko.observableArray(["Apple", "Bananna", "Grapes", "Oranges"]); 
 
var allFruits = ko.observableArray(["Apple", "Bananna", "kiwi"]); 
 

 
console.log(
 
    chosenFruit().filter(function(v) { 
 
    return allFruits().indexOf(v) > -1; 
 
    }) 
 
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>


UPDATE 3:あなたがobservableArrayを更新したい場合は、コールバック関数でremove()メソッドを使用します。

var chosenFruit = ko.observableArray(["Apple", "Bananna", "Grapes", "Oranges"]); 
 
var allFruits = ko.observableArray(["Apple", "Bananna", "kiwi"]); 
 

 
allFruits.remove(function(v) { 
 
    return chosenFruit().indexOf(v) == -1; 
 
}); 
 

 
console.log(allFruits())
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

+0

'selectedFruit'配列から何も削除していません。 – Redu

+0

@Redu:戻り値を割り当てるだけで、トリック 'selectedFruit = selectedFruit.filter(function(v){ return allFruits.indexOf(v)> -1; })' .....が実行されますが、参考、私はここで必要な参照を考えていません –

+0

いいえ、それはトリックを行いません。そうすれば、 'selectedFruit'を参照する配列はまだ" Apple "、" Bananna "、" Kiwi "と表示されます。代入演算子( '=')のために参照が失われます。 – Redu

0

chosenFruitsアレイであってはならないアイテムの位置を特定し、削除することによって、次のように行うことができます。;従来の機能を有する

allFruits = [ "Apple" , "Bananna" , "Grapes" , "Oranges"], 
 
chosenFruit = ["Apple" , "Bananna" , "Kiwi", "Melon", "Cockroach"]; 
 
    discarded = chosenFruit.reduceRight((p,c,i,a) => !allFruits.includes(c) ? p.concat(a.splice(i,1)) : p,[]); 
 
\t                 
 
console.log(chosenFruit); 
 
console.log(discarded);

allFruits = [ "Apple" , "Bananna" , "Grapes" , "Oranges"], 
 
chosenFruit = ["Apple" , "Bananna" , "Kiwi", "Melon", "Cockroach"]; 
 
    discarded = chosenFruit.reduceRight(function(p,c,i,a){ 
 
             return allFruits.indexOf(c) === -1 ? p.concat(a.splice(i,1)) 
 
                      : p; 
 
             },[]); 
 
\t                 
 
console.log(chosenFruit); 
 
console.log(discarded);

+0

これは愚かな質問ですが、この記号 "=>"は何ですか?私はKnockOut.JSを使用してJSファイルでこれを達成しようとしています。 – user2598808

+0

@ user2598808 ES6 arrow function –

+0

JSファイルで動作しますか?構文エラーが発生しています。 – user2598808

0

console.log($(["Apple" , "Bananna" , "kiwi"]).filter([ "Apple" , "Bananna" , "Grapes" , "Oranges"]).get());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

@Lauriantiありがとう、私はKnockOut.JSを使用する必要があります – user2598808

関連する問題