如何在javascript中最好地搜索和更新两个对象数组

How to best search and update two arrays of objects in javascript?

本文关键字:更新 数组 对象 两个 搜索 javascript      更新时间:2023-09-26

所以我这里有一个Person对象,它具有以下两个属性:firstname和mood。假设firstname属性是唯一的。

如果我有一个由3个人对象组成的数组()(假设每一行都是一个人对象):

Alison, Happy
Bob, Sad
Charles, Happy

如果有第二个数组,例如3个人(来自JSON数组):

Alison, Sad
Bob, Happy
Jordan, Sad

我希望能够以最有效的方式迭代第二个数组以更新第一个数组中的项。我的想法是用2表示循环。例如:

第一次迭代,看到Alison,在第一个数组中搜索Alison,将Alison更新为Sad。第二次迭代,看到Bob,搜索。。。等第三次迭代,看到乔丹,在第一个数组中搜索乔丹,没有找到。。。和乔丹一起把新的物体推到阵列上,萨德。

现在我知道,如果有更好的方法在第一个数组不是数组的情况下实现这一点,那么数组可能不是最好的方法。。可能是一个映射等。我关心的是性能,因为我描述的方法对许多人来说效率非常低,例如,如果数组大小为100。

请帮忙,不胜感激。

这在一定程度上取决于您的浏览器和库环境。有Array.indexOf('value'),但它在IE中不起作用,而且它可能只是在幕后做一个(优化的)循环。

如果你有很多数据,而且很可能会被排序,但事实并非如此,那么最好进行二进制搜索。换句话说,取数据集中间的值,并将其与查询进行比较。如果它更大,您的下一个查询是值集前半部分的中间值,依此类推,直到您得到它

不一定是性能问题的解决方案(尽管比某些更好),但在减少编码开销方面,这类工作的一个很好的替代方案是underscore.js库。使用下划线,可以使用_detect获取值,如果找不到,则只使用Array.push

如果每个人都有一个唯一的id或引用,您可以将他们放在一个对象中,并将该id用作密钥,然后执行:

if (sadBob.id in personCollection) {
    // sadBob is already there
    personCollection.update(sadBob);
} else {
    // add sadBob
    personCollection.addPerson(sadBob);
}

或者,您可以向array2中的person对象添加一个属性,该属性是创建它们时它们在array1中的索引。因此,如果它们没有索引,它们就不在数组1中。如果它们有一个索引,你可以直接去那里(这与上面的对象基本相同,并使用数组索引作为引用或id)。