![](/img/trans.png)
[英]Order of the associative array in JavaScript by key and access by index
[英]javascript associative array access by key value
我有一个像这样的数组:
employees = [
{
"id": 1,
"shift_id": 1,
"days": {
"2012-03-01": 1,
"2012-03-02": 1,
"2012-03-03": 1,
"2012-03-04": 0,
"2012-03-05": 0,
"2012-03-06": 0
}},
{
"id": 2,
"shift_id": 1,
"days": {
"2012-03-01": 0,
"2012-03-02": 1,
"2012-03-03": 1,
"2012-03-04": 1,
"2012-03-05": 1,
"2012-03-06": 0
}},
{
"id": 3,
"shift_id": 2,
"days": {
"2012-03-01": 0,
"2012-03-02": 0,
"2012-03-03": 1,
"2012-03-04": 1,
"2012-03-05": 1,
"2012-03-06": 1
}}
];
有没有一种方法可以使用id值访问此数组中的元素? 也许在jQuery的东西? 像$(employees('id = 1');
只需遍历数组并检查id:
var yourId = 1;
for (var i = 0, len = employees.length; i < len; i++) {
if (employees[i].id == yourId) {
// ...
}
}
您可以使用像这样的函数,该函数适当地过滤数组:
var getEmployee = function (id) {
return employees.filter(function(i) { return i.id == id; });
};
您可以使用此处记录的.grep()
方法:
var employee = $.grep(employees, function(e) { return e.id == 1 })[0];
嗯,有一种jQuery的方法:
var findElementById = function(elements, id) {
return $.grep(elements, function(e) { return e.id === id; })[0];
}
还是我不知道为什么不只按id
索引源数组。
或这个:
$.each(employee, function(){
if(this["id"] == 2){
console.log(this);
}
});
也许您正在寻找类似以下的内容:
$.grep(employees, function(n){return n.id==1});
据我所知,要实现这一点,您必须遍历它们
Array.prototype.getObjectById = function(x){
var catcher = false, i = 0;
while(!catcher){
catcher = this[i].id == x ? this[i] : false;
i++;
}
return catcher;
}
此功能应有帮助。 它将扩展数组对象,因此您可以将其用作myArray.getObjectbyId(id);
通过设计,这将返回符合条件的第一个对象。 您可以像这样扩展它:
Array.prototype.getObjectsById = function(x){
var catcher = [], i = 0;
for(var i = 0; i < this.length; i++){
if(this[i].id == value){
catcher.push(this[i]);
}
i++;
}
return catcher.length == 1 ? catcher[0] : catcher;
}
如果多个对象符合条件,将返回对象数组。
Array.prototype.getObjectsByAttribute = function(x, criteria){
if(!criteria){criteria = 'id';}
var catcher = [], i = 0;
for(var i = 0; i < this.length; i++){
if(this[i].criteria == value){
catcher.push(this[i]);
}
i++;
}
return catcher.length == 1 ? catcher[0] : catcher;
}
这进一步扩展了它以寻找任何标准。
我知道这个问题很旧,但是如果有人偶然发现这个问题,以供将来参考...
与其尝试过度设计用于解析/检查JSON的函数,不如考虑更改数据的结构以适合其用途。
考虑问题中的示例:
data = [ {
"id": 1,
"shift_id": 1,
"days": {
"2012-03-01": 1,
"2012-03-02": 1,
"2012-03-03": 1,
"2012-03-04": 0,
"2012-03-05": 0,
"2012-03-06": 0
}}, { .. }, {...} ]
以这种方式构造数据只能使您可以顺序访问对象,而无法通过特定索引查找对象。 在这种情况下,数组索引通常是没有意义的。
data[0] => { id : 1, .. }
data[1] => { id : 2, .. }
如果id是非顺序的或字母数字的,该怎么办?
使用数组不会帮助您更快地搜索,但仍然需要循环...
而是考虑使用哈希表/对象:
{
'id1' => { id : 1 , data : { ... } },
'id99' => { id : 99, data : { ... } },
'id2' => { id : 2 , data : { ... } },
}
您可以将字符串值用作键,并通过执行以下操作直接访问数据:
data['id2'] => { id : 2, ... }
这将使您直接访问要查找的数据(按ID)。 通过简单地重新组织数据的结构,我们就可以从O(n)搜索变为O(1)搜索。
请记住,此方法对于某些解决方案可能比其他解决方案更好,并且还有许多其他注意事项。
这只是当您要通过唯一属性查找数据时如何解决问题的一种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.