Group array items based on variable javascript

前端 未结 6 1413
囚心锁ツ
囚心锁ツ 2020-12-31 11:18

I have an array that is created dynamic from an xml document looking something like this:

myArray[0] = [1,The Melting Pot,A]
myArray[1] = [5,Mama\'s Mexican         


        
相关标签:
6条回答
  • 2020-12-31 12:02

    You have to create an empty JavaScript object and assign an array to it for each letter.

    var object = {};
    
    for ( var x = 0; x < myArray.length; x++ )
    {
        var letter = myArray[x][2];
    
        // create array for this letter if it doesn't exist
        if ( ! object[letter] )
        {
            object[letter] = [];
        }
    
        object[ myArray[x][2] ].push[ myArray[x] ];
    }
    

    Demo fiddle here.

    0 讨论(0)
  • 2020-12-31 12:05

    Good ol' ES5 Array Extras are great.

    var other = {};
    myArray.forEach(function(n, i, ary){
        other[n[2]] = n.slice(0,2);
    });
    
    0 讨论(0)
  • 2020-12-31 12:11

    You shouldn't use arrays with non-integer indexes. Your other variable should be a plain object rather than an array. (It does work with arrays, but it's not the best option.)

    // assume myArray is already declared and populated as per the question
    
    var other = {},
        letter,
        i;
    
    for (i=0; i < myArray.length; i++) {
       letter = myArray[i][2];
       // if other doesn't already have a property for the current letter
       // create it and assign it to a new empty array
       if (!(letter in other))
          other[letter] = [];
    
       other[letter].push(myArray[i]);
    }
    

    Given an item in myArray [1,"The Melting Pot","A"], your example doesn't make it clear whether you want to store that whole thing in other or just the string field in the second array position - your example output only has strings but they don't match your strings in myArray. My code originally stored just the string part by saying other[letter].push(myArray[i][1]);, but some anonymous person has edited my post to change it to other[letter].push(myArray[i]); which stores all of [1,"The Melting Pot","A"]. Up to you to figure out what you want to do there, I've given you the basic code you need.

    0 讨论(0)
  • 2020-12-31 12:17

    This code will work for your example.

    var other = Object.create(null),  // you can safely use in opeator.
        letter,
        item,
        max,
        i;
    
    for (i = 0, max = myArray.length; i < max; i += 1) {
       item = myArray[i];
       letter = myArray[2];
    
       // If the letter does not exist in the other dict,
       // create its items list
       other[letter] = other[letter] || [];
       other.push(item);
    }
    
    0 讨论(0)
  • 2020-12-31 12:19

    Try -

    var myArray = new Array();
    myArray[0] = [1,"The Melting Pot,A,3,Sake House","B"];
    myArray[1] = [5,"Mama's MexicanKitchen","C"];
    myArray[2] = [6,"Wingdome","D"];
    myArray[3] = [7,"Piroshky Piroshky","D"];
    myArray[4] = [4,"Crab Pot","F"];
    myArray[5] = [2,"Ipanema Grill","G"];
    myArray[6] = [0,"Pan Africa Market","Z"];
    
    var map = new Object();
    for(i =0 ; i < myArray.length; i++){
        var key = myArray[i][2];
        if(!map[key]){
           var array = new Array();        
            map[key] = array;
        }
        map[key].push(myArray[i]);
    
    }
    
    0 讨论(0)
  • 2020-12-31 12:21

    Try groupBy function offered by http://underscorejs.org/#groupBy

    _.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
    
    Result => {1: [1.3], 2: [2.1, 2.4]}
    
    0 讨论(0)
提交回复
热议问题