2013-10-02 4 views
2

У меня есть исходный массив с именами стран и другого массива с продуктами. Индикаторы обоих массивов равны.Данные не сгруппированы правильно

array1:{China, China, Korea, USA, USA}, 

array2:{Lenovo, Asus, Samsung, Apple, Blackberry}, 

result : array : {{China, {Lenovo, Asus}}, {Korea, {Samsung}} ... } 

Но я не могу собрать массивы групп правильно. Я всегда получаю результат

{{China, {Lenovo}},{China, {Asus}} ... }. 

Мой код:

for (i = 0; i < XArray.length; i++) { 
    var pointsArray = []; 

    for (j = 0; j < XArray.length; j++) { 

     if (XArray[i] == XArray[j]) { 
      pointsArray.push([parseFloat(YArray[i]), parseFloat(ZArray[i])]); 
     } 
    } 

    dataSource.push({ 
     name: i, 
     data: pointsArray.slice() 
    }); 
    pointsArray.length = 0; 
} 
+2

Есть ли какая-либо конкретная причина, почему вы используете 2 массивы вместо объект JSON? – jeff

+0

Если США, то массив должен быть: США {Apple, Blackberry} вправо –

+0

Действительно хотите: '[{Китай: [Lenovo, Asus]}, {Корея: [Samsung]} ...'? – RobG

ответ

4

Я думаю, что вы должны использовать объект для производителей группы по стране. Как это:

var conutries, 
    manufacturers, 
    i, 
    len, 
    country, 
    manufacturerByCountry; 
countries = ['China', 'China', 'Korea', 'USA', 'USA']; 
manufacturers = ['Lenovo', 'Asus', 'Samsung', 'Apple', 'Blackberry']; 
len = countries.length; 
manufacturerByCountry = {}; 
// expected result: 
// array : {'China': ['Lenovo', 'Asus'], 'Korea': ['Samsung'] ... } 

for(i = 0; i < len; i++) { 
    country = countries[i]; 
    if(!manufacturerByCountry[country]) { 
     manufacturerByCountry[country] = []; 
    } 
    manufacturerByCountry[country].push(manufacturers[i]); 
} 

console.log(manufacturerByCountry); 

DEMO


Если вы все еще хотите, чтобы получить результат вы описали в вопросе, то вы можете пойти с решением, как это:

var conutries, 
    manufacturers, 
    i, 
    len, 
    country, 
    manufacturerByCountry, 
    countryIndex, 
    index; 
countries = ['China', 'China', 'Korea', 'USA', 'USA']; 
manufacturers = ['Lenovo', 'Asus', 'Samsung', 'Apple', 'Blackberry']; 
len = countries.length, 
manufacturerByCountry = [], 
countryIndex = {}; 
// expected result: 
// array : [[China, [Lenovo, Asus]], [Korea, [Samsung]] ... ] 

for(i = 0; i < len; i++) { 
    country = countries[i]; 
    if(countryIndex[country] === undefined) { 
     index = manufacturerByCountry.push([country, []]) - 1; 
     countryIndex[country] = index; 
    } else { 
     index = countryIndex[country]; 
    } 
    manufacturerByCountry[index][1].push(manufacturers[i]); 
} 

console.log(manufacturerByCountry); 

DEMO

+1

Благодарим вас за это решение. Это отлично работает для меня! –

0

Не совсем уверен в синтаксисе, но я думаю, что вы пытаетесь сделать это:

var array1 = ['China', 'China', 'Korea', 'USA', 'USA']; 
var array2 = ['Lenovo', 'Asus', 'Samsung', 'Apple', 'Blackberry']; 
var result = []; 
var name, names = {}; 
var nameCount = 0; 
var obj; 

for (var i=0, iLen=array1.length; i<iLen; i++) { 
    name = array1[i]; 

    // If haven't found name already, setup structure 
    // so value can be added after the block 
    if (!(name in names)) { 

    // Add name to the list of names and remember its index 
    names[name] = nameCount; 

    // Create a new object 
    obj = {}; 

    // Give it a property with value of name and assign an array 
    obj[name] = []; 

    // Add it to results 
    result.push(obj); 

    // Increment index for next time 
    ++nameCount; 
    } 

    // Add member of array2 to name object's array 
    result[names[name]][name].push(array2[i]); 
} 

, который создает массив объектов, такие как:

[ 
    {China: ['Lenovo', 'Asus']}, 
    {Korea: ['Samsung']}, 
    {USA: ['Apple', 'Blackberry']} 
] 
Смежные вопросы