javascript map数组和返回对象

时间:2018-04-10 17:33:58

标签: javascript associative-array

我有以下JSON数组:

map()

其中每个数组都包含ID,主题和标记。

如何使用JavaScript { "Data Structures" : "26", "English" : "26" } 函数获取响应?:

{{1}}

这意味着它应该返回得分最高的学生的身份。

3 个答案:

答案 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收集最大值,然后渲染对象。

第一部分迭代给定数据并将数组销毁为idsubjectscore

然后进行检查,如果存在对象,如果存在,则将得分或零与实际得分进行比较。

如果支票为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; }