Ajax/socket:javascript数组对象属性丢失

Ajax/socket:javascript数组对象属性丢失,javascript,ajax,node.js,sockets,object,Javascript,Ajax,Node.js,Sockets,Object,在Javascript中,数组[]也可以有属性,因为它是一个对象。但是,如果您通过ajax/socket.io将此对象发送到服务器,它的数组内容将保留,但其属性将丢失 例如: var arr = ['john','peter']; arr.a = 1; console.log(arr.a); // 1 通过ajax发送此对象后,服务器将看到: console.log(arr.a); // undefined 有人知道为什么吗?我正在使用Node.JS作为服务器btw,谢谢 正如其他人提到的,

在Javascript中,数组[]也可以有属性,因为它是一个对象。但是,如果您通过ajax/socket.io将此对象发送到服务器,它的数组内容将保留,但其属性将丢失

例如:

var arr = ['john','peter'];
arr.a = 1;
console.log(arr.a); // 1
通过ajax发送此对象后,服务器将看到:

console.log(arr.a); // undefined

有人知道为什么吗?我正在使用Node.JS作为服务器btw,谢谢

正如其他人提到的,JSON.stringify()不会序列化数组属性,即使它们不是从proto“继承”的

如果您使用的是jquery,一个快速修复方法就是只使用$.extend({},arr)

如果没有,您可以编写一个函数来轻松地转换为对象:

function convertArrToObj(arr){
     //assuming typeof arr === 'object', put in guards if needed
     var obj = {};
     for (var key in arr){
          if (arr.hasOwnProperty(key))
               obj[key]=arr[key];
     }
     return obj;
}
就我个人而言,我只需要创建一个属性为该数组值的对象,向该父对象添加您需要的任何内容。不过,我不确定这在您的用例中是否可行(我必须查看代码)


Easy,由所有版本的js支持,不需要框架,也不需要运行O(n)来进行转换(arr在这里是一个指针…这可能是一个问题,但对于您的情况来说似乎不是这样)。

什么是
console.log(arr)显示?另外,一定要提供一个SSCCE来复制行为。假设您使用json作为传输格式,它不会序列化除数字索引以外的属性。@Musa,那么有没有办法做到这一点?不要使用数组,使用常规对象。使用合理的数据结构。
var toSend = {data:arr, customProp:'value'};