按键值在Object Array中查找元素

时间:2014-02-07 16:28:36

标签: javascript arrays object find

通过其中一个键的值,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] ,但是如果我们想保持订单怎么办?

提前致谢。

3 个答案:

答案 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})