字符映射对象最大值出现

时间:2018-06-14 00:18:50

标签: javascript arrays

我有一个字符映射,我正在尝试设置一个查找多个最高值的函数并将其返回到数组[{H:2},{E:2},R:{2} ]。 如果在charMap X中有另一个字符并且它的值为3那么该数组只能是[{X:3}]

const charMap = {H: 2, I: 1, T: 1, E: 2, R: 2};

我可以这样做以获得最高的数字并返回该字符,但它将始终返回最后一个最高的字符。

const reduced = Object.keys(charMap).reduce((a, b) => {
  return charMap[a] > charMap[b] ? a : b; 
});

我想也许是一个双循环来检查一个与另一个但不确定这是否有点过分。 任何想法如何做到这一点。

2 个答案:

答案 0 :(得分:1)

我们可以使用charMap遍历for..in,并在下面加注最高

let charMap = {  H: 2,  I: 1,  T: 1,  E: 2,  R: 2 };
let highest, result = [];

for (var key in charMap) {
  if (!result.length || charMap[key] > highest) {
    result = [{
      [key]: charMap[key]
    }]
    highest = charMap[key]
  } else if (charMap[key] === highest) {
    result.push({
      [key]: charMap[key]
    })
  }
}

console.log(result)

答案 1 :(得分:0)

首先要考虑的是,有26个字符,在考虑区分大小写时可能是52个字符,在允许其他符号时可能还有几十个字符。任何考虑的解决方案是O(n)。总之,这意味着在编写代码时,不存在对性能的担忧,因此可读性应该是优先级(无论我们是否迭代所有字符一次或十次都无关紧要。)

我们需要以下内容:

  • charMap

  • 的任何属性的最大值
  • 所有最大值为

  • 的属性(字符)
  • 所有在数组中格式化为{ [character]: maximum }的属性



const charMap = { H: 2, I: 1, T: 1, E: 2, R: 2 };

// Get the maximum value
let max = Math.max(...Object.values(charMap));

// For the example `charMap`, this will be 2
console.log(`Maximum: ${max}`);

// Get all properties that have the value of the maximum.
// Here we need access to both key and value.
// One could loop over the keys and get the values
// by using charMap[key], but i prefer having both ready.
let charsWithMaxValue = Object.entries(charMap).filter(
  ([key, value]) => value === max
);

// the result of this, for the example, looks like this:
// [["H", 2], ["E", 2], ["R", 2]]
// Don't worry about the JSON, it's just to make
// it easily readable in the console
console.log(`charsWithMaxValue: ${JSON.stringify(charsWithMaxValue)}`);

// Alternative (note that this changes the format
// of the intermediate result, so formatting code
// also needs to change if this is used):
/*
let charsWithMaxValue = Object.keys(charMap).filter(
  key => charMap[key] === max
);
// alternate intermediary result:
// ["H", "E", "R"]
*/

//Format to the desired result
let result = charsWithMaxValue.map(
  ([key, value]) => ({ [key]: value })
);

// Alternative formatting:
/*
let result = charsWithMaxValue.map(
  key => ({ [key]: max })
);
*/

console.log(`result: ${JSON.stringify(result)}`);




请注意,这会使用一些更现代的功能,例如Object.valuesObject.entries

我的评论中的代码将过滤和格式化步骤视为一体,部分原因是在将代码填入注释时出现问题,产生的代码不仅仅是执行三个步骤,而每个步骤都希望更清晰。