我有一个单级别的键/值对数组,如下所示:
var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square']
我需要一个函数来执行以下操作:
在这种情况下,它会产生以下结果:
user_filters= ['color=blue', 'size=large', 'shape=square']
像...一样的东西。
function update_array(){
$.each(user_filters, function(i){
var key = this.split('=')[0];
if(key is second occurrence in user_filters)
{
var index = index of first occurrence of key
user_filters[index] = user_filters[i];
user_filters.splice(i,1);
}
});
}
最好的方法是什么?谢谢!
答案 0 :(得分:4)
我会将数据保存在一个对象中,这样任何重复都会自动覆盖前一个条目..
见例如:
var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square'];
var object = {};
for (var i = 0; i < user_filters.length; i++) {
var currentItem = user_filters[i].split('=');
var key = currentItem[0];
var value = currentItem[1];
object[key] = value;
}
console.log(object);
答案 1 :(得分:0)
您可以使用哈希对象来获取没有重复项的键值对,然后将哈希对象转换回如下数组:
function removeDuplicates(arr) {
var hash = arr.reduce(function(h, e) {
var parts = e.split("=");
h[parts[0]] = parts[1];
return h;
}, {});
return Object.keys(hash).map(function(key) {
return key + "=" + hash[key];
});
}
var user_filters = ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square'];
console.log(removeDuplicates(user_filters));
&#13;
答案 2 :(得分:0)
您可以使用Map自动执行唯一/覆盖,并且能够在需要时为您提供阵列
var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square'];
var m = new Map(user_filters.map(v => v.split("=")));
console.log([...m.entries()].map(v => v.join("=")));
&#13;
答案 3 :(得分:0)
从数组后面迭代会更好, 因此,对于每个唯一键,您需要保持变量true或false(最初为false)。 所以,如果真正的意思已经发生,那么删除它,否则保持它并使其变量为真。
接近你当前的方法要好得多。你不必保留最后一个索引并交换然后删除。
答案 4 :(得分:0)
您可以转换为json,然后再转换回所需的数组格式。在下面的代码中,您将获得所需格式的结果对象。
var user_filters= ['color=blue', 'size=small', 'shape=circle', 'size=large', 'shape=square'];
function toJson(obj){
var output = {};
$.each(obj, function(i){
var keyvalPair = this.split('=')
var key = keyvalPair[0];
output[key]= keyvalPair[1];
});
return output;
}
function toArray(obj){
var output = [];
$.each(obj, function(i){
output.push(i+"="+obj[i]);
});
return output;
}
var result = toArray(toJson(user_filters));
console.log(result);