2015-07-13 3 views
1

Я искал несколько дней и не нашел ответа на эту конкретную проблему. Я получаю массив объектов javascript из конечной точки в моем API. Мне нужно объединить объекты на основе типа.Объекты группы JavaScript

пример жестко закодированы массив объектов:

$scope.content = { 
    things: [ 
     { 
      thing: 'one', 
      thingType: 'load' 
     }, 
     { 
      thing: 'two', 
      thingType: 'export' 
     }, 
     { 
      thing: 'three', 
      thingType: 'export' 
     } 
    ] 
} 
var typeArr = []; 
for (var key in $scope.content.things) { 

    typeArr[key] = $scope.content.things[key].thingType; 
} 
typeArr = _.uniq(typeArr); 

typeArr теперь будет [нагрузка, экспорт] Что должно произойти дальше, чтобы сравнить все объекты в вещи [], что

if(typeArr[key] === things[i].thingType) 

будет толкать этот объект так:

typeArr = [ 
    load: { 
     thing: 'one', 
     thingType: 'load' 
    }, 
    export: [{ 
     thing: 'two', 
     thingType: 'export' 
    }, 
    { 
     thing: 'three', 
     thingType: 'export' 
    } 

    ] 
] 

другими словами, мне нужны объекты остаются ш и мне нужно их классифицировать и вставлять в соответствии с общим типом. Я всерьез застрял на этой неделе. Любое понимание было бы весьма благодарным.

ответ

2

Попробуйте


 
var content = { 
 
    things: [ 
 
     { 
 
      thing: 'one', 
 
      thingType: 'load' 
 
     }, 
 
     { 
 
      thing: 'two', 
 
      thingType: 'export' 
 
     }, 
 
     { 
 
      thing: 'three', 
 
      thingType: 'export' 
 
     } 
 
    ] 
 
} 
 
var typeArr = {}; 
 
content.things.forEach(function(item){ 
 
    typeArr[item.thingType] = typeArr[item.thingType]||[]; 
 
    typeArr[item.thingType].push(item); 
 
}); 
 

 
document.body.innerHTML = JSON.stringify(typeArr);

+0

Это работает великолепно. Он возвращает полный список соответствующим образом. Я довольно новичок в JS, начиная с C#, все еще не очень привык к использованию анонимных функций, подобных этому. Большое спасибо за ваш своевременный ответ! –

0

Будет ли это приемлемым?

var things = [ 
 
    { 
 
     thing: 'one', 
 
     thingType: 'load' 
 
    }, 
 
    { 
 
     thing: 'two', 
 
     thingType: 'export' 
 
    }, 
 
    { 
 
     thing: 'three', 
 
     thingType: 'export' 
 
    } 
 
]; 
 

 
var types = {}; 
 

 
for (i in things) { 
 
    var thing = things[i]; 
 
    if (typeof types[thing.thingType] === "undefined") { 
 
    types[thing.thingType] = []; 
 
    } 
 
    types[thing.thingType].push(thing); 
 
} 
 

 
console.log(types);

Полученный types объект будет выглядеть

{ 
    load: [{ 
     thing: 'one', 
     thingType: 'load' 
    }], 
    export: [{ 
     thing: 'two', 
     thingType: 'export' 
    }, 
    { 
     thing: 'three', 
     thingType: 'export' 
    }] 
} 

То есть, каждый тип всегда массив, даже если он содержит только один элемент (в вашем примере это просто объект). Но я думаю, что вам было бы легче справиться в любом случае, зная, что вы всегда будете ожидать массив.

0

Не 100% Я знаю, на что вы нацеливаетесь, но я возьму на него удар. Это то, что вы имеете в виду ..

Demo

$scope.content = { 
     things: [ 
      { 
       thing: 'one', 
       thingType: 'load' 
      }, 
      { 
       thing: 'two', 
       thingType: 'export' 
      }, 
      { 
       thing: 'three', 
       thingType: 'export' 
      } 
     ] 
    } 

    $scope.groups = {}; 
    $scope.group = group; 


    function group(){ 

    angular.forEach($scope.content.things, function(thing){ 

     if($scope.groups.hasOwnProperty(thing.thingType)){ 
     $scope.groups[thing.thingType].push(thing); 
     } else { 
     $scope.groups[thing.thingType] = [thing]; 
     } 

    }); 


    } 
Смежные вопросы