2015-03-08 3 views
3

(открыт также для решения PHP)Re-категоризировать родительский массив из объектов дочернего массива в Javascript

Если у меня есть массив в пределах массива, как вы повторно классифицировать родительский массив на основе объекты дочернего массива?

Вот пример того, что я хотел бы достичь:

Say, если исходный массив:

[ 
{ 
    "name":"Jade", 
    "tags":[ 
    "developer" 
    ] 
}, 
{ 
    "name":"Bridge", 
    "tags":[ 
    "cook" 
    ] 
}, 
{ 
    "name":"Ever", 
    "tags":[ 
    "artist" 
    ] 
}, 
{ 
    "name":"Noah", 
    "tags":[ 
    "artist", 
    "developer" 
    ] 
} 
] 

Я хочу, чтобы иметь возможность повторно классифицировать его в:

[ 
"artist": { 
    { 
    { 
     "name":"Noah", 
     "tags":[ 
     "artist", 
     "developer" 
     ] 
    } 
    } 
"developer": { 
    { 
     "name":"Jade", 
     "tags":[ 
     "developer" 
     ] 
     }, 
    { 
     "name":"Noah", 
     "tags":[ 
     "artist", 
     "developer" 
     ] 
    } 
    }, 
    "cook": { 
    { 
     "name":"Bridge", 
     "tags":[ 
     "cook" 
     ] 
    }, 
    } 
] 

Вот что я пробовал:

(исходный массив данных var)

var data = [original array] 
var newArray = []; 

for (var i = 0; i < data.length; i++) { 
    for (var a = 0; a < data[i].tags.length; a++) { 
    newArray[] = data[i].tags[a]; 
    if (newArray[i] == data[i].tags[a]) { 
     newArray[i] = data[i]; 
    } 
    } 
} 

Моя теория состоит в том, чтобы совать тег (в тегах) в новый массив, и если исходное object.tags имеет такое же значение, как новый объект в массиве, поп исходного объекта в новый объект.

Этот подход не удался.

+0

ну ваш код выглядит как javascript. И там у вас есть массив объектов. Поэтому вам нужно будет использовать объектные методы. – floor

+0

@floor Эй извините. Я пытался сделать это через интерфейс, но если это проще сделать с помощью php, я могу настроить задний конец для интерпретации этого API. Благодарю. –

+0

Ваш пример для ожидаемого результата сломан, а также немного странно. Неужели вы хотите, чтобы каждое задание содержало массив объектов? (люди)? – rjdown

ответ

0

Я бы рекомендовал базовое решение (php), поскольку оно будет значительно быстрее, когда вы увеличите масштаб.

<?php 
    $sInFile = 'in.json'; 
    $sOutFile = 'out.json'; 

    $aDevelopers = array(); 
    $aArtists = array(); 
    $aCooks  = array(); 

    $sRaw  = file_get_contents($sInFile); 
    $aInData = json_decode($sRaw); 
    $iCountData = count($aInData); 
    for($i = 0; $i < $iCountData; ++$i) 
    { 
     $iCountTags = count($aInData[ $i ]->tags); 
     for($j = 0; $j < $iCountTags; ++$j) 
     { 
      $aTmp = array(); 
      if((!empty($aInData[ $i ]->tags[ $j ])) && $aInData[ $i ]->tags[ $j ] == 'developer') 
      { 
       $aTmp[ 'name' ] = $aInData[ $i ]->name; 
       $aTmp[ 'tags' ] = $aInData[ $i ]->tags; 
       $aDevelopers[] = $aTmp; 
      } 
      $aTmp = array(); 
      if((!empty($aInData[ $i ]->tags[ $j ])) && $aInData[ $i ]->tags[ $j ] == 'artist') 
      { 
       $aTmp[ 'name' ] = $aInData[ $i ]->name; 
       $aTmp[ 'tags' ] = $aInData[ $i ]->tags; 
       $aArtists[] = $aTmp; 
      } 
      $aTmp = array(); 
      if((!empty($aInData[ $i ]->tags[ $j ])) && $aInData[ $i ]->tags[ $j ] == 'cook') 
      { 
       $aTmp[ 'name' ] = $aInData[ $i ]->name; 
       $aTmp[ 'tags' ] = $aInData[ $i ]->tags; 
       $aCooks[] = $aTmp; 
      } 
     } 
    } 

    $aFull[ 'developer'] = $aDevelopers; 
    $aFull[ 'artist' ] = $aArtists; 
    $aFull[ 'cook' ] = $aCooks; 
    $sFull = json_encode($aFull); 
    file_put_contents($sOutFile, $sFull); 
?> 
+0

Похоже, мне нужно будет вручную создать новые категории массивов по мере увеличения количества тегов. Реально есть около сотни этих тегов, и я думаю, что ручное создание всех из них станет неуправляемым. –

+0

Преобразование в динамический массив обнаружения профессии? :) Вы можете настроить скрипт, чтобы сделать массив уникальным, поскольку он создает временные заполнители и сохраняет их перед передачей данных профессии. –

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