通过其中一个键的值,Object Array中find元素(Object)的最佳结构解决方案是什么。
例如我们有数组:
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}
}
现在我们可以一步完成 someObject [34] ,但是如果我们想保持订单怎么办?
提前致谢。
答案 0 :(得分:2)
我考虑过重组并拥有对象而不是数组
是的,没关系。
但是如果我们想要保留订单呢?
我倾向于使用包含正确顺序键的额外数组,例如
var order = [17, 34, 47];
要循环它们,你可以使用
for (var i=0; i<order.length; i++) {
… someObject[order[i]] …
}
答案 1 :(得分:1)
您应该在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_
前缀以避免命名与方法和诸如此类的冲突。对象应该包含属性和方法,如果您像字典一样使用它,至少通过前缀来防止干扰。
答案 2 :(得分:1)
您可以使用findWhere
库中的underscore
函数,在您的情况下,它会是这样的:
_.findWhere(someArray, {id: 34})