我在多选选项列表中获取重复值,并且值动态来自 PHP 中的数据库。现在我想从我的多选选项列表中删除这些重复值。我如何实现这个Javascript或Jquery?下面是我的代码。
.HTML
<select name="countries[]" id="update_supp_last_countries" style="width:305px;" multiple="multiple" required>
<?php
foreach($supp_last_count_Row as $results5){
$supp_last_country5[$i5] = $results5['countries'];
$i5++;
?>
<option value='<?php echo $supp_last_country5[$itr5];?>' selected> <?php echo $supp_last_country5[$itr5];?> </option>
<?php $itr5++; } ?>
<option value="Afghanistan">Afghanistan</option>
<option value="Albania">Albania</option>
<option value="Algeria">Algeria</option>
<option value="American Samoa">American Samoa</option>
<option value="Andorra">Andorra</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Antartica">Antarctica</option>
<option value="Antigua and Barbuda">Antigua and Barbuda</option>
爪哇语
var optionValues = [];
$('#update_supp_last_countries option').each(function() {
optionValues.push($(this).val());
});
var size = optionValues.length;
alert(optionValues);
现在我在选项值数组中获取重复的值。我怎样才能删除它。提前谢谢。
如果jQuery.unique()做这种工作会很好,但它做了一些不同的事情,不适合适应。
Hmffff,如果我们想要一个jQuery方法,我们必须编写自己的插件。
jQuery.fn.uniqueAttrs = function(attr) {
if(!attr) return this;
var that = this;
return this.filter(function (index, node) {
return that.index(that.filter(function() {
return this[attr] === node[attr];
})) === index;
});
};
像这样打电话:
var $ul = $('#update_supp_last_countries');
$ul.html($ul.find('option').uniqueAttrs('value'));
演示
解释:
这个答案提供了一个简洁的解决方案来过滤掉 js 数组中的重复值。为了使相同的方法适用于jQuery集合,并过滤匹配的属性(在本例中为"值"),需要进行轻微的调整。
这种方法的好处是:
- 它只依赖于jQuery,
- 选项元素不需要重新生成 - 返回包含过滤原始元素的集合,不假设集合中的节点(除了给定属性存在)。因此,该插件具有良好的可重用性度量。
如果有缺点,那就是过滤器中的过滤器对性能不是很理想。该插件将明显变慢,包含数百个以上的元素。在我的小型 1.6 GHz 机器(有性能问题)上,我得到了这些数字,在几次运行中取平均值:
- 20 个选项:40 ms 50
- 个选项:50 ms
- 100 个选项:75 ms
- 200 个选项:300 ms
- 400 选项:600 ms
同样出于某种原因我不明白,如果反复应用$ul.html($ul.find('option').uniqueAttrs('value'))
,那么selectedIndex
每次都会前进一个元素 - DEMO。
我使用 http://phpjs.org 函数(array_unique()
)从数组中删除重复,空,空或假值。
我所做的只是将所有国家/地区存储在一个数组中,清理数组中的重复或错误值,然后重新绘制它。
// array_unique compressed:
function array_unique(d){var c="",b={},e="";var a=function(h,g){var f="";for(f in g){if(g.hasOwnProperty(f)){if((g[f]+"")===(h+"")){return f}}}return false};for(c in d){if(d.hasOwnProperty(c)){e=d[c];if(false===a(e,b)){b[c]=e}}}return b};
var optionValues = [];
$('#update_supp_last_countries option').each(function() {
optionValues.push($(this).val());
$(this).remove(); // remove the option element
});
var cleanedArray = array_unique(optionValues); // clean the array
// let's go to paint the new options
for(var i in cleanedArray) {
var opt = $('<option/>')
.attr('value', cleanedArray[i]) // note that the value is equal than the text
.text(cleanedArray[i]);
$('#update_supp_last_countries').append(opt);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="update_supp_last_countries">
<option value="Afghanistan">Afghanistan</option>
<option value="Albania">Albania</option>
<option value="Algeria">Algeria</option>
<option value="Algeria">Algeria</option>
<option value="Algeria">Algeria</option>
<option value="American Samoa">American Samoa</option>
<option value="Andorra">Andorra</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Antartica">Antarctica</option>
<option value="Antigua and Barbuda">Antigua and Barbuda</option>
</select>