【问题标题】: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
});

})

【问题讨论】:

    标签: javascript arrays node.js string split


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多