如何创建具有最大元素的唯一键数组?
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) => (([k,v]) => ((r[k] || 0) < v) ? r.set(k,v) : r )(s.split(':')), new Map())].map(([k,v]) => `$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 ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
c_cpp 给定一个数组,打印具有递增顺序的元素的最大子数组