Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javascript对象简化为唯一标识符_Javascript_Jquery_Javascript Objects - Fatal编程技术网

将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”]。我想做的是,通过将过滤结果存储在唯一变量中,避免对一组项目多次执行非常慢的过滤代码

因此:

  • 将设置转换为唯一id,然后查看该变量是否存在
  • 如果变量存在,只需获取包含已筛选项的变量
  • 如果变量不存在,则对数百个项目执行非常缓慢的筛选,并将这些项目存储在唯一id变量中
  • 希望我没有让这更让人困惑。我觉得我可能让它更混乱了。

    您可以使用,这是一种为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\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