在JSONArray创build后出现额外的数字

我正在用javascript创build一个JSONArray,并且我的新数组发生了一些奇怪的事情:

var arrayfinal = new Array(); //Order array by elements function SortByPuntuation(x,y) { return x.puntuation - y.puntuation; } for (var i = data.length - 1; i >= 0; i--) { if(arrayfinal){ arrayfinal[i] = arrayfinal.push({'cathegory':data[i].cname , 'puntuation' : 2 * data[i].cnumber + data[i].click}); } else{ arrayfinal[i] = {'cathegory':data[i].cname , 'puntuation' : 2 * data[i].cnumber + data[i].click }; } }; arrayfinal = arrayfinal.sort(SortByPuntuation); 

数据是另一个数组:

 {"cname":"Sillas","cnumber":0,"click":1}, {"cname":"Mesas","cnumber":0,"click":2}, {"cname":"Plastico diferente","cnumber":0,"click":0}, {"cname":"Vasos","cnumber":5,"click":7}, {"cname":"Ordenadores","cnumber":0,"click":2}, {"cname":"Envases cuadrados","cnumber":0,"click":0}, {"cname":"Envases redondos","cnumber":0,"click":0}, {"cname":"Teclados ordenador","cnumber":0,"click":0}, {"cname":"Film transparente","cnumber":0,"click":0}, {"cname":"Pantallas","cnumber":0,"click":1}, {"cname":"Papeles","cnumber":0,"click":2}, {"cname":"Otro","cnumber":0,"click":0}, {"cname":"Coches","cnumber":0,"click":9}, {"cname":"Libros","cnumber":0,"click":2}, {"cname":"Asus","cnumber":0,"click":1} 

最后的结果是:

 [ 29, { cathegory: 'Plastico diferente', puntuation: 0 }, { cathegory: 'Envases cuadrados', puntuation: 0 }, { cathegory: 'Otro', puntuation: 0 }, { cathegory: 'Envases redondos', puntuation: 0 }, { cathegory: 'Film transparente', puntuation: 0 }, { cathegory: 'Teclados ordenador', puntuation: 0 }, 22, 21, 20, 19, 18, 17, 16, 28, { cathegory: 'Sillas', puntuation: 1 }, 27, 26, 25, { cathegory: 'Pantallas', puntuation: 1 }, 24, 23, { cathegory: 'Papeles', puntuation: 2 }, { cathegory: 'Ordenadores', puntuation: 2 }, { cathegory: 'Libros', puntuation: 2 }, { cathegory: 'Mesas', puntuation: 2 }, { cathegory: 'Coches', puntuation: 9 }, { cathegory: 'Vasos', puntuation: 17 }, 1 ] 

finalarray中出现的数字从哪里来?

这是因为你push的结果(这是新的长度)分配给arrayfinal[i]

更改

 arrayfinal[i] = arrayfinal.push({'cathegory':data[i].cname , 'puntuation' : 2 * data[i].cnumber + data[i].click}); 

 arrayfinal.push({'cathegory':data[i].cname , 'puntuation' : 2 * data[i].cnumber + data[i].click}); 

你的代码通常可以通过初始化数组,使用前向循环并将每个元素推送到数组来工作。

 var arrayfinal = []; for(var i = 0; i < data.length; i++) { arrayfinal.push({ 'cathegory':data[i].cname , 'puntuation' : 2 * data[i].cnumber + data[i].click }); }; 

通过混合数组查找和Array#push避免你创build的问题:

 arrayfinal[i] = arrayfinal.push(...); 

它在元素被添加到它之后返回数组的新长度。


另外,你可以使用Array#map

 var arrayfinal = data.map(function(category){ return { 'cathegory': category.cname, 'puntuation': 2 * category.cnumber + category.click }; });