我知道这里有很多答案,大多数建议通过对象循环,返回你需要的东西,我不确定这是最好的方法,无论如何。
我所拥有的数组entries
引用另一个数组people
(id
和name
)person_id
和projects
(使用id
和name
)project_id
。
我需要的是能够在id
的循环内访问具有特定entries
的项目和人员,因此我可以获取他们的名字。做其他人的建议我会在people
的每次烦恼中循环projects
和entries
,这似乎是非常多的循环。
所以我以为我会在init上创建一个我称之为“哈希表”的“{1}}和people
”,这意味着创建一个新对象projects
和{{1其中key是id
所以
people_hashtable
会变成
projects_hashtable
这样我就可以轻松访问名称,而不会一直循环,同时仍然保持旧数组的原始顺序(这就是为什么我不是这样直接从服务器输出它,你不能完全订购一个对象,我在选择框中使用[
{
"id": "8",
"name": "John Doe"
}
]
和{
"8": {
"name": "John Doe"
}
}
,需要按名称排序。
我做得对吗?还有更好的方法吗?或者我应该完全忘记这一点并按照其他问题的建议坚持搜索循环?
我正努力在服务器端和客户端都尽可能高效。
答案 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" }
}
}
}
反过来。