为什么数组上的. tostring给出一个奇怪的结果
Why .toString on an array gives a strange result?
我知道这个问题反映了我未能完全理解JS中对象和数组之间的差异,以及何时最好使用两者。我正在寻找理解为什么下面的函数的输出是如此疯狂,并希望这将帮助我理解Objs和数组在JS中的一些细微之处。
//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);
});
}
在本例中,sold和open都是键值数组。response
的输出是我所期望的:
[ { Output: { sold: [Object], open: [Object] } } ]
然而,如果我只是稍微修改这一点,通过添加一个.toString()
到任何一个数组,我得到波浪的大量输出,最终导致我不得不硬杀死进程。解决方案是显而易见的,我需要传递对象而不是数组,并使用JSON.strigify()
。我的问题是,为什么这些结果会有如此大的不同?意外输出是使用键值数组的.push的结果吗?我已经成功地使用了键值对数组,但是我是否应该将reply更改为对象并删除推送方法?
重要的是要理解Javascript中的"键值数组"根据定义意味着您正在谈论对象。因为对象是键值,数组是索引值。
你的代码有点难读,因为我不知道你给出了什么输入,也不知道你期望得到什么输出。但是如果我理解正确的话,您希望返回一个具有两个属性的对象:sold
和open
,因此您可以将其称为reply.sold
和reply.open
。这意味着reply
应该是一个对象,有两个键:"sold"answers"open"。这两个键的两个值都将是一个包含订单的数组。这些不需要是对象,因为不需要键。
实际上可以在一行中定义对象reply
,以及两个数组reply.sold
和reply.open
:
var reply = { sold: [], open: [] }
这意味着你的响应函数看起来像这样:
var response = function(sold, open){
reply.sold.push(sold);
reply.open.push(open);
callback(reply);
};
最后这将是reply
的结构:
{
sold: [ order1, order2, order3, ... ],
open: [ orderA, orderB, orderC, ... ]
}
由于reply.sold
和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 */ }
- 检查搜索结果是否存在多次如果是,则在Javascript中只显示一个结果
- 使用NextToken使用javascript aws-sdk解析下一个结果
- Angular.forEach 只返回一个结果
- 谷歌地图商店定位器只返回一个结果
- .each() 函数只输出数组中的最后一个结果
- 如何通过PHP或JavaScript将整个DIV数据发送到下一个结果页面
- 将一个结果集除以另一个结果集,然后显示答案
- foreach 只产生一个结果
- 查找主干集合上的位置仅返回一个结果
- 插入数据库时如何从数据库中检索最后一个结果
- 在 JavaScript 中添加表值会在 NaN 的表单元格中给我一个结果
- 如何将一个结果列表合并到一个包含汇总的压缩对象中
- java脚本regex.match只查找一个结果
- 输出一个结果数组,其中包含给定数组的唯一元素的分组计数
- 从XML文件中隔离一个结果
- 骨干收集发现我只想要一个结果
- 我需要用AJAX Post声明一个结果类型吗
- 在另一个结果中的单选按钮
- 我试图从一个函数内的函数返回一个结果
- 在Javascript页面中搜索-一个结果错误