当前位置: 首页 > 面试题库 >

如何在保持键查找的同时保持Javascript对象/数组有序?

滕英奕
2023-03-14
问题内容

我有一些最初存储在通用Javascript对象中的数据,其ID为键:

{
  "7": {"id":"7","name":"Hello"},
  "3": {"id":"3","name":"World"},
  ...
}

但是,我发现浏览器在循环浏览时并不能保证特定的对象顺序,因此在上面的“ 3”将出现在“ 7”之前。我改用这样的数组格式:

[
  {"id":"7","name":"Hello"},
  {"id":"3","name":"World"},
  ...
]

现在,我可以按正确的顺序循环,但是不能进行快速查找,例如data["3"],不必循环遍历数组。

是否有结合两种方法的好方法?我宁愿避免为每种格式使用单独的对象,因为该对象非常大(数百个元素)。


问题答案:

我也遇到了这个问题。解决方案是除了原始对象之外,还保留键的有序数组。

var objects = {
  "7": {"id":"7","name":"Hello"},
  "3": {"id":"3","name":"World"},
  ...
}
var order = [ "3", "7", ... ];

现在,如果要第二个元素,可以执行以下查找:

var second_object = objects[order[1]];

ECMA标准未提及对象中元素的顺序。尤其是Chrome浏览器在它们 看起来像 数字时会重新排序。例:

var example = {
    "a": "a",
    "b": "b",
    "1": "1",
    "2": "2"
};

如果您在Chrome浏览器中进行打印,则会得到以下内容:

{
    1: "1",
    2: "2",
    "a": "a",
    "b": "b"
};

有点酸..但是生活。

您也可以使用与Andy链接的解决方案,基本上将这两个对象包装在一个对象中。

我经常使用的替代方法是自定义地图函数,该函数可让您指定对象的遍历顺序。通常,在将数据打印给用户时,您将进行排序,因此在循环和创建表行(例如)时,迭代器将按排序函数指定的顺序传递行。我认为这是个好主意:)

签名看起来像:

function map(object, callback, sort_function);

用法示例:

map(object, function (row) {
   table.add_row(row.header, row.value);
}, function (key1, key2) {
   return object[key1] - object[key2];
});


 类似资料:
  • 原数据 D替换key和value中的A之后,顺序变了 HTML渲染 替换方法 这个是座位图,每一个key是每一列的编号,编号修改了,那一列的座位号中的字母也要跟着变,现在头疼的是改完后数据顺序变了,编码和座位号对不上,所以我希望得到结果是替换完之后,数据顺序保持不变。或者大家有别的好方法好思路可以指导一下

  • 问题内容: 我有一个使用Comparable <>定义“自然排序顺序”的对象。这些都存储在TreeSet中。 除了删除和重新添加对象外,还有用于更新排序定义成员的成员时更新排序的另一种方法吗? 问题答案: 正如其他人指出的那样,没有内置方法。但是,您始终可以使用您选择的构造函数将该TreeSet子类化,并添加所需的功能: 从那时起,您将必须调用以更新排序值和排序本身。这确实需要您在数据对象中实现其

  • 我将为我的后期项目创建一个移动的圆圈,圆圈将继续移动,它的内部颜色将像颜色发射一样变化,变化的颜色将在5个级别中从小圆圈到大圆圈,所以如何保持每个颜色的变化保持一段时间,我希望这些代码与线程一起出现,所以我创建了两个线程,一个控制圆圈移动,另一个控制圆圈的内部颜色发射,这里是我的代码:

  • 假设我们有一个由三个数组组成的数组,每个数组的初始容量为10。然后会为30个容量分配空间,对吗?那么,当Y发生变异,现在容量为20时会发生什么呢?或者,如果数组解释了这些变化,并分配了比最初需要的更多的空间,那么它会得到多少空间(例如在Java中),以及当这些空间用完时会发生什么?

  • 问题内容: 我在目标C中使用JSON-FRAMEWORK来解析JSON对象。当我调用[jsonString JSONValue]时,我得到了一个字典,但是键的顺序与我解析的JSON对象的顺序不同。无论如何,要保持此顺序不变? 问题答案: 根据定义 ,在JSON对象中,键值对的顺序没有意义。该规范允许JSON生产者以其想要的任何方式对它们进行置换,甚至是随机的- 并且不需要解析器来保留顺序。RFC