Javascript - 按键搜索对象

时间:2013-04-10 09:26:22

标签: javascript json search loops optimization

我知道这里有很多答案,大多数建议通过对象循环,返回你需要的东西,我不确定这是最好的方法,无论如何。

我所拥有的数组entries引用另一个数组peopleidnameperson_idprojects(使用idnameproject_id

我需要的是能够在id的循环内访问具有特定entries的项目和人员,因此我可以获取他们的名字。做其他人的建议我会在people的每次烦恼中循环projectsentries,这似乎是非常多的循环。

所以我以为我会在init上创建一个我称之为“哈希表”的“{1}}和people”,这意味着创建一个新对象projects和{{1其中key是id

所以

people_hashtable

会变成

projects_hashtable

这样我就可以轻松访问名称,而不会一直循环,同时仍然保持旧数组的原始顺序(这就是为什么我不是这样直接从服务器输出它,你不能完全订购一个对象,我在选择框中使用[ { "id": "8", "name": "John Doe" } ] { "8": { "name": "John Doe" } } ,需要按名称排序。

我做得对吗?还有更好的方法吗?或者我应该完全忘记这一点并按照其他问题的建议坚持搜索循环?

我正努力在服务器端和客户端都尽可能高效。

4 个答案:

答案 0 :(得分:3)

为了避免循环,你基本上将所有对象加倍。所以,除非你有一些不好的性能问题,否则我会避免这种情况。 如果你真的需要一种hashmap,我宁愿存储数组的索引而不是该对象的另一个副本:

// array
var arr = [
  {
    "id": "8",
     "name": "John Doe"
  }
];

// lookup table
var lookup = {
  "8": 0
}

当然这样做意味着你无法在不重建hashmap的情况下修改数组。

生成它非常简单:

var lookup = arr.reduce(function(lookup, item, index) {
  lookup[item.id] = index;
  return lookup;
}, {});

您也可以使用它来生成您提到问题的对象:

var lookup = arr.reduce(function(lookup, item) {
  lookup[item.id] = {name: item.name};
  return lookup;
}, {});

但正如我说的那样,我会避免。

答案 1 :(得分:0)

以下代码可能会对您有所帮助。 JSFIDDLE

var arr = [
  {
    "id": "8",
    "name": "John Doe"
  }
];

var obj = {};
for(var i=0; i< arr.length; i++){
   obj[arr[i].id] = {name: arr[i].name};
}

console.log(obj);

答案 2 :(得分:0)

{{1}}

答案 3 :(得分:-1)

此lib https://github.com/paularmstrong/normalizr使其变得非常简单。归一化和非规范化。

可以改变这个

{
  "id": "123",
  "author": {
    "id": "1",
    "name": "Paul"
  },
  "title": "My awesome blog post",
  "comments": [
    {
      "id": "324",
      "commenter": {
        "id": "2",
        "name": "Nicole"
      }
    }
  ]
}

进入这个

{
  result: "123",
  entities: {
    "articles": { 
      "123": { 
        id: "123",
        author: "1",
        title: "My awesome blog post",
        comments: [ "324" ]
      }
    },
    "users": {
      "1": { "id": "1", "name": "Paul" },
      "2": { "id": "2", "name": "Nicole" }
    },
    "comments": {
      "324": { id: "324", "commenter": "2" }
    }
  }
}

反过来。