我正在动态构建一个对象数组,使用的过程可以归结为如下:
//Objects Array
var objects = [];
//Object Structure
var object1 = {"id":"foobar_1", "metrics":90};
var object2 = {"id":"some other foobar", "metrics":50};
objects[0] = object1;
objects[1] = object2;
(郑重声明,如果您能想出一种更好的方法来动态嵌套数据,以便我可以使用 objects[i].id
访问它,我也洗耳恭听!)
最终将会有比上面更多的逻辑在发挥作用,但它只是还没有写出来。只要说“object1”和“object2”部分实际上位于迭代器中就足够了。
在该迭代器内,我想在将另一个对象添加到数组之前检查 ID 是否存在。例如,如果我已经有一个 ID 为 "foobar_1"
的对象,我只想增加其 "metrics"
,而不是将新成员推送到数组中值。
如果我不处理对象数组,我可以使用 inArray
来查找“foobar_1”(一个 jQuery 实用程序)。但这不会研究对象的值。在我看来,我有两个选择:
保留一个仅包含 ID 的单独简单数组。因此,我不是仅仅依赖
objects
数组,而是简单地检查inArray
(或普通的 JS 等效项)是否有一个仅用于此目的的简单“objectIDs”数组。迭代我现有的数据对象,并将我的
“foobar_1”
针与每个objects[i].id
干草堆进行比较
我觉得#1 肯定更高效,但我不禁想知道我是否缺少一个可以为我完成这项工作的功能。我错过了#3、4 或5 个选项! CPU 消耗有些重要,但我也对那些使代码不那么冗长的函数感兴趣,无论它们是否更具循环效率。
最佳答案
我建议切换到对象而不是数组:
var objects = {};
objects["foobar_1"] = {metrics: 90};
objects["some other foobar"] = {metrics: 50};
然后,要添加唯一的新对象,您可以这样做:
function addObject(id, metricsNum) {
if (!(id in objects)) {
objects[id] = {metrics: metricsNum};
}
}
要迭代所有对象,您可以这样做:
for (var id in objects) {
// process objects[id]
}
这可以让您非常有效地查找给定的 ID 是否已在您的列表中。它唯一没有提供数组之前提供给您的是对象的特定顺序,因为对象的键没有任何特定的顺序。
关于javascript - 测试对象数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9688501/