根据子数组重新分类父数组';Javascript中的s对象
(也对php解决方案开放) 如果数组中有一个数组,如何根据子数组的对象对父数组重新分类 以下是我想要实现的一个例子: 假设原始数组是:根据子数组重新分类父数组';Javascript中的s对象,javascript,php,arrays,Javascript,Php,Arrays,(也对php解决方案开放) 如果数组中有一个数组,如何根据子数组的对象对父数组重新分类 以下是我想要实现的一个例子: 假设原始数组是: [ { "name":"Jade", "tags":[ "developer" ] }, { "name":"Bridge", "tags":[ "cook" ] }, { "name":"Ever", "tags":[ "artist" ] }, { "name":"Noah", "t
[
{
"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=[原始数组]
var newArray=[];
对于(变量i=0;i
我的理论是将标记(在标记中)弹出到一个新数组中,如果原始object.tags与数组中的新对象具有相同的值,则将原始对象弹出到新对象中
这种方法失败了。我推荐一种后端解决方案(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 );
?>
您的代码看起来像javascript。在上面有一个对象数组。因此,您将需要使用对象方法。@对不起。我希望通过前端实现,但是如果通过php更容易实现,我可以设置后端来解释这个API。谢谢。你的预期结果的例子是坏的,也有点奇怪。您肯定希望每个作业都包含一个对象数组?(人)?@rjdown正确。我注意到我的解决方案既不干净也不高效。我对一种更智能的方法持开放态度。看起来随着标签数量的增加,我需要手动创建新的数组类别。实际上,大约有数百个这样的标签,我认为手动创建所有这些标签将变得难以管理。转换为动态职业检测阵列?:)您可以调整脚本,使其在创建临时占位符时具有唯一的数组,并在将数据提交给专业之前存储它们。
<?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 );
?>