Javascript 为什么。对数组进行字符串转换会产生奇怪的结果?

Javascript 为什么。对数组进行字符串转换会产生奇怪的结果?,javascript,arrays,object,Javascript,Arrays,Object,我知道这个问题反映了我未能完全理解JS中对象和数组之间的区别,以及何时最好同时使用两者。我想了解为什么下面函数的输出如此疯狂,希望这能帮助我理解JS中Objs和数组的一些细节 //orders is an array of numbers function myFunction(orders, callback){ var sold = []; //fixed by changing to an obj var open = []; //fixed by changing to an o

我知道这个问题反映了我未能完全理解JS中对象和数组之间的区别,以及何时最好同时使用两者。我想了解为什么下面函数的输出如此疯狂,希望这能帮助我理解JS中Objs和数组的一些细节

//orders is an array of numbers
function myFunction(orders, callback){  
 var sold = []; //fixed by changing to an obj
 var open = []; //fixed by changing to an obj
 var reply = [];
 var response = function(sold, open){ 
     reply.push({Output: {sold:sold, open:open}});
     callback(reply);
  };
  orders.forEach(function(id, i){
    //somelogic that builds sold and open
    if(i == orders.length -1) response(sold, open);
  });
 }
在本例中,sell和open都是键值数组。
响应的输出是我所期望的:

[ { Output: { sold: [Object], open: [Object] } } ]

然而,如果我只是通过向任一数组添加一个
.toString()
来稍微修改它,我会得到大量的tildes输出,最终导致我不得不硬终止进程。解决方案很明显,我需要传入对象而不是数组,并使用
JSON.strigify()
。我的问题是,为什么这些结果有如此大的不同?意外输出是使用.push和键值数组的结果吗?我已经成功地将数组用于键值对,但是我是否也应该更改对象的reply并放弃push方法?

重要的是要理解,Javascript中的“键值数组”根据定义意味着您在谈论对象。因为对象是键值,数组是索引值

您的代码有点难读,因为我不知道您提供了什么输入,也不知道您希望得到什么输出。但如果我理解正确,您希望返回一个具有两个属性的对象:
sall
open
,因此您可以将其称为
reply.sall
reply.open
。这意味着
reply
应该是一个对象,有两个键:“sell”和“open”。这两个键的两个值都是包含订单的数组。它们不需要是对象,因为不需要键

实际上,您可以定义对象
reply
,以及两个数组
reply.salled
reply.open

var reply = { sold: [], open: [] }
这意味着您的响应函数如下所示:

var response = function(sold, open){ 
    reply.sold.push(sold);
    reply.open.push(open);
    callback(reply);
};
最后,这将是回复的结构:

{
    sold: [ order1, order2, order3, ... ],
    open: [ orderA, orderB, orderC, ... ]
}
由于
reply.salled
reply.open
现在是数组,您只需使用
.join(glue)
将它们转换为可读性更强的字符串:

var soldString = reply.sold.join(", ") // "order1, order2, order3, ..."
var openString = reply.open.join(", ") // "orderA, orderB, orderC, ..."
在这种情况下,使用数组的另一个有用之处是,您实际上可以给命令一个特定的顺序(没有双关语)。对于对象,大多数Javascript引擎在执行“for in”循环时都会按字母顺序遍历属性。然而,这并不是保证。但是在数组上调用
.forEach()
或执行常规for循环时

//  assuming object "obj", and array "arr"
for(var key in obj) { /* order of "key" is not guarantied */ }
for(var i = 0; i < arr.length - 1; i ++) { /* "i" is always in ascending order */ }
//假设对象为“obj”,数组为“arr”
对于(obj中的var key){/*不保证“key”的顺序*/}
对于(var i=0;i

希望这能有所帮助。

您能展示一下如何调用
响应吗?
?上面粘贴的代码是标准JavaScript,没有特定于节点的内容。为什么不创建一个JSFIDLE并将其与预期和意外结果共享?@thefourtheye更新了代码以反映每个请求的
响应调用请显示您为函数提供的输入、它产生的输出以及您预期的输出。