Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么对性能最好:带键的数组还是包含数组的键?_Javascript_Arrays_Json - Fatal编程技术网

Javascript 什么对性能最好:带键的数组还是包含数组的键?

Javascript 什么对性能最好:带键的数组还是包含数组的键?,javascript,arrays,json,Javascript,Arrays,Json,我不确定什么json结构是基于性能的最佳结构 我的结构目前如下所示: { "walk": [ {"x": 15,"y": 22,"on": ["onactive"]}, {"x": 15,"y": 22,"on": ["onactive","agreeConditions"]} ] } for(var i = 0; i< walk.length; i++){ console.log(walk[i].x); console.l

我不确定什么json结构是基于性能的最佳结构

我的结构目前如下所示:

{
    "walk": [
        {"x": 15,"y": 22,"on": ["onactive"]},
        {"x": 15,"y": 22,"on": ["onactive","agreeConditions"]}
    ]
}
for(var i = 0; i< walk.length; i++){
    console.log(walk[i].x);
    console.log(walk[i].y);
    console.log(walk[i].on);
}
for(var i = 0; i< walk.x.length; i++){
    console.log(walk.x[i]);
    console.log(walk.y[i]);
    console.log(walk.on[i]);
}
这将基本上在每个数组对象中重复键。这将占用空间

在javascript中,您可以这样循环:

{
    "walk": [
        {"x": 15,"y": 22,"on": ["onactive"]},
        {"x": 15,"y": 22,"on": ["onactive","agreeConditions"]}
    ]
}
for(var i = 0; i< walk.length; i++){
    console.log(walk[i].x);
    console.log(walk[i].y);
    console.log(walk[i].on);
}
for(var i = 0; i< walk.x.length; i++){
    console.log(walk.x[i]);
    console.log(walk.y[i]);
    console.log(walk.on[i]);
}
这将只是一个包含所有键的对象,对于每个键,它都包含一个数组。绝对占用更少的空间

在javascript中,您可以这样循环:

{
    "walk": [
        {"x": 15,"y": 22,"on": ["onactive"]},
        {"x": 15,"y": 22,"on": ["onactive","agreeConditions"]}
    ]
}
for(var i = 0; i< walk.length; i++){
    console.log(walk[i].x);
    console.log(walk[i].y);
    console.log(walk[i].on);
}
for(var i = 0; i< walk.x.length; i++){
    console.log(walk.x[i]);
    console.log(walk.y[i]);
    console.log(walk.on[i]);
}
for(变量i=0;i
基本上区别在于包含键的数组和包含数组的键

那么,一个好的json结构将如何基于性能呢

排列(

键:值,键:值

)

反对(

键:数组(值,值)


)

如果您想知道哪一个更快,可以运行自己的基准测试。不过,两者之间应该几乎没有区别

我倾向于选择第一种结构,因为它更容易理解,并且如果需要,它允许您将对象作为参数传递。例如,我可以编写一个函数:

function shiftWalkPoint(walkPoint, n) {
    walkPoint.x += n;
    walkPoint.y += n;
}

for (var i = 0; i < walk.length; i++){
    shiftWalkPoint(walk[i], 5);
}
功能移位路径点(路径点,n){
步行点x+=n;
行走点y+=n;
}
对于(变量i=0;i

但是,对于第二种格式,您不能这样做。您必须将整个
walk
对象以及索引传递给想要使用它的任何函数,这会更麻烦。如果数据和
x.length!=y、 长度

从JSON格式可以看出,文本格式中唯一的大小差异是对象数组中重复的属性名称。您还可以看到,更容易看到哪些值在对象数组中属于同一个值

从访问结构的方式来看,没有性能差异。访问使用的对象数组
walk[i].x
,这相当于
walk[i][x]
。访问包含使用的数组的对象
walk.x[i]
,这相当于
walk[x][i]
。唯一的区别是访问顺序,这不会影响性能

从内存使用情况来看,差别非常小。类似于
[15,15]
的数组在内存中表示为一个对象,其中项是带有数字键的属性,基本上与
{“length”:2,“0”:15,“1”:15}
相同。这使得对象和数组在内存使用方面几乎相同

总之:

  • 包含数组的对象在文本形式(JSON)上稍微紧凑一些
  • 包含对象的数组更容易读取
  • 在访问它们时没有性能差异
  • 它们将占用大约相同的内存量

代码如何知道将
列表中的第一个数组与“x”而不是“y”关联?如果显式地维护顺序,它将起作用,但是请注意,当您使用
对。。。在
(不是你在这里这么做)。@Pointy我认为
列表中的
第一个数组与
x
的第一个元素和
y
的第一个元素相关联。我同意性能差异可能完全可以忽略,除非它是一个大型结构(在这种情况下,可能还有其他错误),但我怀疑现代JS运行时会在可能的情况下特别处理数组数字索引属性,并避免显式存储“键”。@Pointy:是的,一些浏览器确实优化了数组访问(),但这没有任何区别。我们将一个数组访问和一个对象访问与一个对象访问和一个数组访问进行比较,并且在另一个之前进行一次操作不会改变性能。是的,这绝对正确。无论如何,我同意Erlang的Joe Armstrong的观点,他说程序员应该只编写最漂亮的程序他们可以,把微观优化留给平台人员(而算法优化才是真正重要的:)