将javascript对象减少为唯一标识符

时间:2017-08-18 18:22:20

标签: javascript jquery javascript-objects

我有一个对象,我在其中存储页面设置,如下所示:

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"]。我想要做的是通过将过滤结果存储在唯一变量中,避免在一堆项目上多次过滤代码真的很慢。

所以:

  1. 将设置转换为唯一ID,并查看该变量是否存在。
  2. 如果存在变量,只需获取具有已过滤项的变量。
  3. 如果变量不存在,请对数百个项目进行非常慢的过滤,并将这些项目存储在唯一的id变量中。
  4. 希望我没有让这更令人困惑。我觉得我可能让它更令人困惑。

3 个答案:

答案 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)。

我希望对你有所帮助:)。