如何创建具有最大元素的唯一键数组?

Posted

技术标签:

【中文标题】如何创建具有最大元素的唯一键数组?【英文标题】:How to create an array of unique keys with the largest element? 【发布时间】:2018-09-24 21:44:03 【问题描述】:

我正在尝试从组中找出最大的数字并将它们分配到一组唯一组中。我尝试使用 map 和 lodash uniq 但没有帮助

例子

假设主数组由一个 typeid 和一个用冒号 (:) 分隔的数字组成 我想从每个 typeid 中找出最大的数字,然后他们用它创建一个数组。

从下面的示例中,我尝试生成如下所示的输出

["abcdwidets:6564","nightly:6543"]

6564 & 6543 是各自组中的最大值

代码

var mainarray = ["abcdwidets:1234","abcdwidets:3432","abcdwidets:6564","nightly:3423","nightly:6543"]
var arr = [];
var needle;
var i = 0;
var flag = 0;
mainarray.forEach( (element) => 
arr = element.split(":");
arr = arr.map((val) => 
return val
);

)

【问题讨论】:

【参考方案1】:

Reduce将数组转换成Map,并得到每个key的最大数(:之前的字符串)。然后Array.map() Map 的entries iterator(由spreading)返回一个数组:

const mainarray = ["abcdwidets:1234","abcdwidets:3432","abcdwidets:6564","nightly:3423","nightly:6543"];

const result = [...mainarray.reduce((r, s) => 
  const [k, v] = s.split(':');

  if(!r.has(k) || r.get(k) < v) r.set(k, v);

  return r;
, new Map())]
.map(([k, v]) => `$k:$v`);

console.log(result);

【讨论】:

这很神奇,你能告诉我们在主数组上执行reduce时“...”的用法吗? 将 Map 展开成数组,调用 Map's entries iterator 来创建数组。返回的数组格式为[[key, value], [key, value], etc...] 可以更干净一点const result = [ ...mainarray.reduce((r, s) =&gt; (([k,v]) =&gt; ((r[k] || 0) &lt; v) ? r.set(k,v) : r )(s.split(':')), new Map())].map(([k,v]) =&gt; `$k:$v`)所以Map.prototype.set实际上返回了改变后的Map,你可以内联函数来分割每个条目 @NeilLunn - 谢谢。我知道 1Map.set()` 返回 Map 的实例,我曾经使用它编写 reduce 方法。但是,我发现它的可读性较差。【参考方案2】:

U 需要像这样将 mainArray 拆分为 2 个数组

arr1=['abcdwidets', 'nightly', ..., n];
arr2=[1628, 0378, 6144, ..., n];

一旦您将主数组拆分为这 2 个,然后您只需进行冒泡排序并将这 2 个再次变为 1。

【讨论】:

以上是关于如何创建具有最大元素的唯一键数组?的主要内容,如果未能解决你的问题,请参考以下文章

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

最多具有K个元素的最大连续子数组

c_cpp 给定一个数组,打印具有递增顺序的元素的最大子数组

如何在没有分组依据的情况下选择具有最大技能属性的 ID

在 O( log(log (max_value))) 中找到具有非递减连续差的排序数组中小于 X 的最大元素

如何在元素列表中找到最大的数字,可能是非唯一的?