我有以下JSON数组:
map()
其中每个数组都包含ID,主题和标记。
如何使用JavaScript {
"Data Structures" : "26",
"English" : "26"
}
函数获取响应?:
{{1}}
这意味着它应该返回得分最高的学生的身份。
答案 0 :(得分:1)
由于您正在使用数组,因此如果您愿意,可以使用Array.prototype.reduce。此解决方案循环遍历数组中的每个项目,并根据当前记录是否高于上次记录的记录,将当前记录保存到提供的累加器(在这种情况下为{}
。),从而产生以下对象。
{
"Data Structures": { "id": 26, "score": 72 },
"English": { "id": 26, "score": 81 }
}
如果你想进一步将其简化为主题和最佳学生的ID,你可以遍历对象键并将值设置为id。
var myArray = [
[22, "Data Structures", 45],
[23, "English", 52],
[22, "English", 51],
[26, "Data Structures", 72],
[23, "Data Structures", 61],
[26, "English", 81]
];
var findMaxScores = function(highScores, entry) {
var currentId = entry[0];
var currentSubject = entry[1];
var currentScore = entry[2];
var record = highScores[currentSubject];
if (record === undefined || currentScore > record.score) {
highScores[currentSubject] = {
id: currentId,
score: currentScore,
};
}
return highScores;
}
var highScores = myArray.reduce(findMaxScores, {});
Object.keys(highScores).forEach(subject => highScores[subject] = highScores[subject].id);
console.log(highScores);
答案 1 :(得分:0)
您可以使用Map
收集最大值,然后渲染对象。
第一部分迭代给定数据并将数组销毁为id
,subject
和score
。
然后进行检查,如果存在对象,如果存在,则将得分或零与实际得分进行比较。
如果支票为true
,请设置/更新地图。
为了获得结果,所有条目都取自地图,并且对于每个条目,返回一个对象,主题为键,id为值。
稍后,Object.assign
从许多对象创建一个对象。
var array = [[22, "Data Structures", 45], [23, "English", 52], [22, "English", 51], [26, "Data Structures", 72], [23, "Data Structures", 61], [26, "English", 81]],
map = new Map,
result;
array.forEach(([id, subject, score]) => {
if ((map.has(subject) && map.get(subject).score || 0) < score) {
map.set(subject, { id, score });
}
});
result = Object.assign(
...[...map.entries()].map(([subject, { id }]) => ({ [subject]: id }))
);
console.log(result);
答案 2 :(得分:0)
我会先对数据进行排序,然后将每个条目的第一个类别添加到地图中。
var scoringData = [
[22, "Data Structures", 45],
[23, "English", 52],
[22, "English", 51],
[26, "Data Structures", 72],
[23, "Data Structures", 61],
[26, "English", 81]
];
var sorters = [ { key : 1, dir : 1 }, { key : 2, dir : -1 } ];
console.log(retrieveHighest(scoringData, sorters, 1, 0));
function retrieveHighest(data, sorters, categoryIndex, targetIndex) {
var sorter = multiSorter.apply(null, sorters);
return data.sort(sorter).reduce((result, item) => {
if (result[item[categoryIndex]] === undefined) {
result[item[categoryIndex]] = item[targetIndex];
}
return result;
}, {});
}
function multiSorter(sorters) {
var tailArgs = Array.prototype.slice.call(arguments, 1);
return function(a, b) {
var key = typeof sorters === 'object' ? sorters.key : sorters;
var dir = typeof sorters === 'object' ? sorters.dir : 1;
var aV = a[key], bV = b[key];
var equality = (typeof aV === 'string' ? aV.localeCompare(bV) : aV - bV) * dir;
if (equality === 0 && arguments.length > 1) {
return multiSorter.apply(null, tailArgs)(a, b);
}
return equality;
};
}
.as-console-wrapper { top: 0; max-height: 100% !important; }