从对象列表中添加和获取值的最快方法

时间:2015-08-31 02:02:01

标签: javascript jquery local-storage

我刚刚开始使用JavaScript对象。我正在尝试按ID和位置存储目录库存。我认为单个对象看起来像这样:

var item = {
    id: number,
    locations: ["location1", "location2"]
 };

我已经开始阅读有关它的内容,但我仍然试图绕过它。不确定将新项目添加到包含位置的列表的最快方法是什么,在现有项目中添加新位置,同时检查dupes。稍后获取位置的表现并不重要。这是运行数千次检查以最终按ID和位置获取项目的流程的一部分,因此性能至关重要。

最后一个问题,我甚至不确定是否可以将其存储在本地存储中。从另一个类似的问题来看,我不确定。

2 个答案:

答案 0 :(得分:1)

使用lodash,这样的内容应该可以确定项目ID是否存在,并将新项目附加到数组中,或者只添加新位置:

var item = [{
        id: 1,
        locations: ["location1", "location2"]
     },{
        id: 2,
         locations: ["location2", "location4"]
     }];

    function findItem(id){
        return _.findIndex(item, function(chr) {
            return chr.id == id;
        });
    }
    function addItem(id,locations) {
        var position = findItem(id);
        if (position<0) {
            item.push({
                id: id,
                locations: locations
            })
        } else { 
            item[position].locations = _.uniq(item[position].locations.concat(locations));
        }
    }

    addItem(2,['location292']);
    addItem(3,['location23']);
    console.log(item);

它基本上做的是搜索对象数组(item)以获取id作为我们传递给addItem()函数的id,如果发现我们将新位置数组添加到现有项目中,如果不是,它正在创建一个具有新id和位置的新对象。

答案 1 :(得分:0)

您提出了一个包含一些权衡的问题:

  1. 检索位置列表的最简单,最快捷的方法是将它们存储在数组中。
  2. 检查重复项的最快方法不是数组,而是维护密钥索引的translate对象。
  3. 所以,你必须更多地讨论你想要的权衡集。是否要优化添加非重复的性能或优化检索位置列表的性能。选择其中一个。

    对于localStorage,您可以在LocalStorage中存储任何字符串,并且可以将非引用对象转换为具有map的字符串,因此这种类型的结构可以存储在LocalStorage中。

    例如,如果您想使用数组进行优化检索,那么您可以在添加之前检查这样的重复项:

    JSON.stringify()

    此外,您可以在LocalStorage中存储一系列项目,如下所示:

    function addLocation(item, newLocation) {
        if (item.locations.indexOf(newLocation) === -1) {
            item.locations.push(newLocation);
        }
    }
    

    然后,过了一段时间,您可以像这样检索它:

    localStorage.setItem("someKey", JSON.stringify(arrayOfItems));