将javascript对象简化为唯一标识符
我有一个存储页面设置的对象,看起来像这样:将javascript对象简化为唯一标识符,javascript,jquery,javascript-objects,Javascript,Jquery,Javascript Objects,我有一个存储页面设置的对象,看起来像这样: var filters={ "brands":["brand1","brand2","brand3"], "family":"reds", "palettes":["palette1","palette2","palette3"], "color":"a1b2" }; 当用户浏览页面时,此对象会不断更改。我在代码中寻找一些快速的方法(可能使用内置的jquery或javascript函数)将当前设置对象简化为一个唯一的标
var filters={
"brands":["brand1","brand2","brand3"],
"family":"reds",
"palettes":["palette1","palette2","palette3"],
"color":"a1b2"
};
当用户浏览页面时,此对象会不断更改。我在代码中寻找一些快速的方法(可能使用内置的jquery或javascript函数)将当前设置对象简化为一个唯一的标识符,我可以在不使用大量循环的情况下引用它。也许是这样的:
var filters={
"brands":["brand1","brand2","brand3"],
"family":"reds",
"palettes":["palette1","palette2","palette3"],
"color":"a1b2"
};
“品牌品牌1品牌2品牌3家族品牌1品牌2品牌3色彩1”
不必将对象转换为那样的长字符串,只要它是特定设置组所独有的。我以后不需要将这个标识符转换回对象
编辑:
我需要提供更多的信息
我希望将我正在执行的过滤器的结果项存储在一个名为与唯一ID相同的变量中。因此,var uniqueID1来自设置对象,该设置对象具有brand1和brand2,并且包含[“filteredObject1_1”,“filteredObject1_2”…,“filteredObject1_500”],变量uniqueID2来自设置对象,该设置对象具有brand3和brand4,并包含[“filteredObject2_1”,“filteredObject2_2”…,“filteredObject2_500”]。我想做的是,通过将过滤结果存储在唯一变量中,避免对一组项目多次执行非常慢的过滤代码
因此:
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\u cached\u filter
时存储一个对象,该对象具有每个过滤器的键。如果已使用相同的确切筛选器调用了get\u cached\u 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];
});
});
如果以后不需要将此标识符转换回对象,可以在此处使用以下简单的哈希函数:
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;
}
函数UniqueHashCode(obj){
var str=JSON.stringify(obj)
var散列=0;
如果(str.length==0)返回哈希;
对于(i=0;i 散列=((hash您也可以添加一些数据。条件是否与AND和带有OR的数组部分相连接?唯一标识符的确切含义是什么?请查看对我答案的编辑,并让我知道它们是否是您想要的。我相信他们是在问如何为对象创建唯一标识符,而不是实际应用其过滤器。有多大可能e与此哈希函数冲突?被否决,因为元素不能保证以相同的顺序序列化。也就是说,不同引擎中的JS对象,有时甚至同一引擎中的属性顺序都不能保证,具体取决于对象的填充方式。请看@JuanMendes哦,你是对的,我已经忘记了这一点.Hm.您可以做的是序列化JSON,确保属性名称按字母顺序排列(您不能只使用JSON.stringify
)