私は単純なフィルタリングシステムを構築しています。リンクをクリックしたときに既に配列に文字列を追加して削除したいだけです。できる限りのことを説明しようと思います。
$(document).ready(function(){
//so I start with an empty array
var filters [];
//when a link is clicked I want to add it to the array..
$('li a', context).click(function(e){
//so I get the value held in the data-event attribute of the clicked item example: "john"
newFilter = $(this).attr('data-event');
//this is where I get stuck, I want to test to see if the string I now have
//in 'newFilter' is in the array already or not.. if it is in the array I
//want to remove it, but if it doesnt exist in the array i want to add it..
if(jQuery.inArray(newFilter, filters){
//add to array
} else {
//remove from array
};
e.preventDefault();
});
});
$。inArray() は、アイテムが見つかった場合はそのインデックスを返し、-1
それ以外の場合(サポートされている場合は indexOf() と同様)。したがって、次のように書くことができます。
var found = jQuery.inArray(newFilter, filters);
if (found >= 0) {
// Element was found, remove it.
filters.splice(found, 1);
} else {
// Element was not found, add it.
filters.Push(newFilter);
}
私は間違っているかもしれませんが、これは基本的なjavascriptを使用するのと同じくらい簡単だと思います: [.Push
、 .splice
]
if($.inArray(newFilter, filters)<0) {
//add to array
filters.Push(newFilter); // <- basic JS see Array.Push
}
else {
//remove from array
filters.splice($.inArray(newFilter, filters),1); // <- basic JS see Array.splice
};
もちろん、本当に単純化したい場合は、いくつかの行を削除してインラインコーディングに減らすことができます。
0 > $.inArray(newFilter,filters) ? filters.Push(newFilter) : filters.splice($.inArray(newFilter,filters),1);
ABSOLUTE pure JSの場合:
var i; (i=filters.indexOf(newFilter))<0?filters.Push(newFilter):filters.splice(i,1);
分解:
var i; // Basic variable to be used if index of item exist
// The following is simply an opening to an inline if statement.
// It's wrapped in () because we want `i` to equal the index of the item, if found, not what's to follow the `?`.
// So this says "If i = an index value less than 0".
(i=filters.indexOf(newFilter)) < 0 ?
// If it was not found, the index will be -1, thus Push new item onto array
filters.Push(newFilter) :
// If found, i will be the index of the item found, so we can now use it to simply splice that item from the array.
filters.splice(i,1);
Lodash関数「xor」を使用できます。
_.xor([2, 1], [2, 3]);
// => [1, 3]
2番目のパラメーターとして配列がない場合は、変数を配列に簡単にラップできます。
var variableToInsertOrRemove = 2;
_.xor([2, 1], [variableToInsertOrRemove]);
// => [1]
_.xor([1, 3], [variableToInsertOrRemove]);
// => [1, 2, 3]
ドキュメントは次のとおりです。 https://lodash.com/docs/4.16.4#xor
配列を使用する特別な理由がない限り、代わりにオブジェクトを使用することをお勧めします。
$(document).ready(function(){
//so I start with an empty array
var filters {};
//when a link is clicked I want to add it to the array..
$('li a', context).click(function(e){
//so I get the value held in the data-event attribute of the clicked item example: "john"
newFilter = $(this).attr('data-event');
//this is where I get stuck, I want to test to see if the string I now have
//in 'newFilter' is in the array already or not.. if it is in the array I
//want to remove it, but if it doesnt exist in the array i want to add it..
if (filters.hasOwnProperty(newFilter)) {
// remove from object
delete filters[newFilter];
} else {
//add to object
filters[newFilter] = 'FOO'; // some sentinel since we don't care about value
};
e.preventDefault();
});
});
それのようなもの?
var filters = [];
// ...
var newFilter = '...';
if(-1 !== (idx = jQuery.inArray(newFilter, filters))) {
// remove
filters.splice(idx, 1);
} else {
// add
filters.Push(newFilter);
}
私が見つけた別の方法:
削除する:
filters = jQuery.grep(filters, function(value) {
return value != newFilter;
});
追加:
filters.Push(newFilter)