根据其中一个键的值,对象数组中查找元素(对象)的最佳结构解决方案是什么?
例如,我们有数组:
var someArray =
[
{id:17, color:'black', width:50},
{id:34, color:'red', width:150},
{id:49, color:'gree', width:10}
]我们需要找到一个id-key = 34的对象。
每次我们都要做循环来找到对象。我考虑的是重组和拥有对象,而不是像这样的数组:
var someObject =
{
17: {id:17, color:'black', width:50},
34: {id:34, color:'red', width:150},
49: {id:49, color:'gree', width:10}
}现在我们可以在一步someObject34中完成它,但是如果我们想要保持order呢?
提前谢谢。
发布于 2014-02-08 13:38:50
我考虑过重组和拥有对象而不是数组。
是的,那很好。
但如果我们想遵守命令呢?
我倾向于使用一个包含按正确顺序排列的键的额外数组,如
var order = [17, 34, 47];要循环它们,您可以使用
for (var i=0; i<order.length; i++) {
… someObject[order[i]] …
}发布于 2014-02-07 16:40:14
您应该在id前缀以避免命名冲突,如下所示:
var database =
{
'row_17' : {id:17, color:'black', width:50},
'row_34' : {id:34, color:'red', width:150},
'row_49' : {id:49, color:'gree', width:10}
};此时,您可以使用以下代码查询对象:
function retrieve(database, id)
{
id = 'row_' + id;
if (!database.hasOwnProperty(id))
{
return null;
}
return database[id];
}持久化功能是:
function persist(database, obj)
{
database['row_' + obj['id']] = obj;
}如果你需要遵守命令,你首先要明白你在说的是什么顺序。
id的吗?插入的吗?还是任意的财产?
通过过滤(提取项并将它们放入一个单独的数组中,这将是查询结果,或者带有其他字段或结构),所有这些问题都有解决方案。
编辑:如何保持插入顺序
您将需要一个跟踪顺序的数组:
database._ordered = [];在插入时,也将项目推到那里:
database._ordered.push(obj);现在,您可以按键和所有订购的项目来选择单个项目。在对象中不可能有订单,这只是一个错误的工具。
建议使用row_前缀来避免与方法之类的命名冲突。对象应该保存属性和方法,如果您像字典一样使用它,至少可以通过前缀来防止干扰。
发布于 2014-07-30 16:08:19
您可以从findWhere库中使用函数underscore,在您的示例中,如下所示:
_.findWhere(someArray, {id: 34})https://stackoverflow.com/questions/21632940
复制相似问题