我有一个对象,我在其中存储页面设置,如下所示:
var filters={
"brands":["brand1","brand2","brand3"],
"family":"reds",
"palettes":["palette1","palette2","palette3"],
"color":"a1b2"
};
当用户浏览页面时,此对象会不断更改。我在代码中寻找一些快速的方法(可能使用内置的jquery或javascript函数)将当前设置对象减少为我可以引用的唯一标识符,而无需使用大量循环。也许是这样的:
" brandsbrand1brand2brand3familyredspalettespalette1palette2palette3colora1b2"
不必将对象转换为类似的长字符串,只要它对特定的一组设置是唯一的。我以后不需要将此标识符转换回对象。
编辑: 我需要提供更多信息。
我希望存储过滤器结果的项目,这些过滤器的结果是在一个名称与唯一ID相同的变量中。因此,var uniqueID1来自具有brand1和brand2的设置对象,并包含[" filteredObject1_1"," filteredObject1_2" ...," filteredObject1_500"],以及var uniqueID2来自具有brand3和brand4的设置对象,并包含[" filteredObject2_1"," filteredObject2_2" ...," filteredObject2_500"]。我想要做的是通过将过滤结果存储在唯一变量中,避免在一堆项目上多次过滤代码真的很慢。
所以:
希望我没有让这更令人困惑。我觉得我可能让它更令人困惑。
答案 0 :(得分:2)
您可以使用JSON,这是一种对为JavaScript设计的对象进行字符串化的方法。
var filters={
"brands":["brand1","brand2","brand3"],
"family":"reds",
"palettes":["palette1","palette2","palette3"],
"color":"a1b2"
};
var uniqueId = JSON.stringify(filters);
uniqueId
等于以下字符串:
{"brands":["brand1","brand2","brand3"],"family":"reds","palettes":["palette1","palette2","palette3"],"color":"a1b2"}
这具有额外的好处,可以使用JSON.parse(uniqueId)
转回到对象。
请注意,对于JSON.stringify
,两个完全相同值的对象将转换为相同的唯一ID。
修改强>:
如果我正确解释了你的编辑,请告诉我。但是,我认为这就是你想要做的。
//object that will act as a cache
var cached_filters = {}
//this assumes the existence of a get_filter function that processes the filters object
function get_cached_filter(filters) {
let uniqueId = JSON.stringify(filters);
//use already cached filters
if (cached_filters[uniqueId]) {
return cached_filters[uniqueId];
//create filter and cache it
} else {
cached_filters[uniqueId] = get_filter(filters);
return cached_filters[uniqueId];
}
}
每次调用get_cached_filter
时,这将存储一个包含每个过滤器键的对象。如果已使用相同的精确过滤器调用get_cached_filter
,则它将从缓存中使用它而不是重新创建它;否则,它将创建它并将其保存在缓存中。
答案 1 :(得分:0)
您可以迭代过滤器对象并使用Array#filter
数据进行过滤。
data.filter(function (o) {
return Object.keys(filters).every(function (k) {
return Array.isArray(filters[k])
? filters[k].some(function (f) { return o[k] === f; })
: o[k] === filters[k];
});
});
答案 2 :(得分:0)
如果以后不需要将此标识符转换回对象,可以使用这个简单的散列函数:
function UniqueHashCode(obj){
var str = JSON.stringify(obj)
var hash = 0;
if (str.length == 0) return hash;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
function UniqueHashCode(obj){
var str = JSON.stringify(obj)
var hash = 0;
if (str.length == 0) return hash;
for (i = 0; i < str.length; i++) {
char = str.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
var filters={
"brands":["brand1","brand2","brand3"],
"family":"reds",
"palettes":["palette1","palette2","palette3"],
"color":"a1b2"
};
alert(UniqueHashCode(filters));
此函数按给定对象创建简单和非常短整数(例如661801383
)。
我希望对你有所帮助:)。