我有一个像这样的数组对象:
[
{'id' : 1, 'school' : 'Harvard', 'score' : 90},
{'id' : 2, 'school' : 'LA University', 'score' : 50},
{'id' : 4, 'school' : 'Cairo', 'score' : 90},
{'id' : 3, 'school' : 'Monster University', 'score' : 70},
{'id' : 4, 'school' : 'Cairo', 'score' : 30},
{'id' : 1, 'school' : 'Harvard', 'score' : 80},
]
我的预期结果如下:
[
{'id' : 1, 'school' : 'Harvard', 'score' : 90},
{'id' : 2, 'school' : 'LA University', 'score' : 50},
{'id' : 3, 'school' : 'Monster University', 'score' : 70},
{'id' : 4, 'school' : 'Cairo', 'score' : 90},
]
我尝试了一些功能,例如array_unique
和array_intersect
,但结果与我的预期不同
因此,当记录有多个记录
时,我的目的是从同一记录中获得更高的分数 希望你们能帮助我感谢
答案 0 :(得分:1)
您可以使用Lodash
轻松完成此操作
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script type="text/javascript">
var data = [
{ 'id': 1, 'school': 'Harvard', 'score': 90 },
{ 'id': 2, 'school': 'LA University', 'score': 50 },
{ 'id': 4, 'school': 'Cairo', 'score': 90 },
{ 'id': 3, 'school': 'Monster University', 'score': 70 },
{ 'id': 4, 'school': 'Cairo', 'score': 30 },
{ 'id': 1, 'school': 'Harvard', 'score': 80 },
]
var result = _(data)
.orderBy(['id', 'school'], ['asc', 'desc'])
.uniqBy('id')
.value();
console.log(result);
</script>
答案 1 :(得分:1)
可能有更好的方法,但这适用于您的示例数据集。我通过“TUTORIALS AND TRAINING”的Youtube教程在回调功能上改编了这个。 https://www.youtube.com/watch?v=6jrZhkphCng
这个usort()方法也在@Sameera引用的链接中进行了演示。
usort($array, function($a, $b){
if([$a['id'], $a['score']] < [$b['id'], $b['score']]){
return -1;
}elseif([$a['id'], $a['score']] > [$b['id'], $b['score']]){
return 1;
} else {
return 0;
}
});
for($i = 0; $i < count($array); $i++){
if($array[$i]['id'] != $array[$i+1]['id']){
$results[$i]['id'] = $array[$i]['id'];
$results[$i]['school'] = $array[$i]['school'];
}
}
array_reverse($results);
json_encode($results); //<--This will output a json encoded string.
这将输出如下数组:
Array
(
[1] => Array
(
[id] => 1
[school] => Harvard
)
[2] => Array
(
[id] => 2
[school] => LA University
)
[3] => Array
(
[id] => 3
[school] => Monster University
)
[5] => Array
(
[id] => 4
[school] => Cairo
)
)
或者如果你使用json_encode()一个像这样的json编码字符串:
{"1":{"id":1,"school":"Harvard"},"2":{"id":2,"school":"LA University"},"3":{"id":3,"school":"Monster University"},"5":{"id":4,"school":"Cairo"}}
答案 2 :(得分:0)
$data = 'Your array of objects';
usort($data, function($a, $b)
{
if($a->id == $b->id)
return $b->score - $a->score;
return strcmp($a->id, $b->id);
});
$known = array();
$finalData = array_filter($data, function ($val) use (&$known) {
$unique = !in_array($val->id, $known);
$known[] = $val->id;
return $unique;
});
print_r($finalData); // your desired array