【问题标题】:Making sense of javascript solution for sorting an array理解用于排序数组的 javascript 解决方案
【发布时间】:2020-11-24 19:20:47
【问题描述】:

问题:编写一个 JavaScript 函数,该函数将获取存储的数字数组并找到第二小和第二大的数字。

不确定这个解决方案是如何工作的:

function Second_Greatest_Lowest(arr_num) {
  arr_num.sort(function(x, y) {
    return x - y;
  });
  var uniqa = [arr_num[0]];
  var result = [];

  for (var j = 1; j < arr_num.length; j++) {
    if (arr_num[j - 1] !== arr_num[j]) {
      uniqa.push(arr_num[j]);
    }
  }
  result.push(uniqa[1], uniqa[uniqa.length - 2]);
  return result.join(',');
}

我想我理解循环中发生了什么,但我不确定为什么当稍后将 uniqa[1] 推入结果数组时这是必要的。他们不是在执行相同的操作吗?

【问题讨论】:

  • 我对您的代码在做什么感到非常困惑。您需要做的就是对数组进行排序,然后得到array[1]array[array.length - 2]
  • @M-Chen-3 这是列出的解决方案。我也在努力理解它。
  • 如果前一个数字与当前数字不同,则该循环似乎仅通过将数字添加到 uniqa 来对排序列表进行重复数据删除。我想确保uniqa[1]uniqa[0] 不同(数组中的最后两个数字也是如此)
  • @rickdenhaan 但是号码不会被推入两次吗? (一次来自循环,一次在循环外)
  • 这个功能太可笑了????你确定作者知道他在做什么吗?感觉就像是排序然后删除重复项的混合。为什么它被推入同一个数组?不知道

标签: javascript arrays algorithm sorting


【解决方案1】:

var numbers = Array(5, 5,6,3,1,67,8,4,2,421,5,1,1,0,0)

function task(numbers)
{
    // Get the unique items
    numbers = numbers.filter((el, index, arr) => arr.indexOf(el) == index);

    // Sort them
    numbers = numbers.sort((a, b) => a-b);
    
    // Take the ones you want
    return Array(numbers[1], numbers.splice(-2)[0])
}

console.log("Targets: ", task(numbers))

【讨论】:

  • 这假设最低和最高数字是唯一的。添加另一个0421,你会得到错误的答案。
  • @rickdenhaan 已修复
  • .sort((a, b) =&gt; a-b).sort()有什么区别?
  • @ΔO'deltazero' 一个是明确的,以便提问的人可以理解正在发生的事情,另一个是速记。
  • 所以过滤器如何获取唯一数字是它迭代数组中的所有项目。它检查项目的索引是否是传递的索引。如果有重复项,则索引将不匹配,因此将从返回数组中排除。例如。如果你有一个由两个 23 组成的数组 Array(23, 23) 并执行 indexOf(23),它将始终返回索引 0,因为 0 是找到的第一个结果的索引。
【解决方案2】:

几乎正确,只有您需要对数组进行的验证大于 1。

function getSecondLowerAndHighest(arr){
    //make the array me unique numbers
    arr = [...new Set(arr)];
    //array from minimum to maximum
    arr.sort((x,y) => x - y);
    const lower = arr[1];
    //array from maximum to minimum
    arr.reverse();
    const high = arr[1];
    return {lower, high};
}

【讨论】:

  • 为了避免做 arr.length - 2 而反转整个数组似乎有点矫枉过正。
  • 对,但如果你想要第二个并且你传递一个变量,那就考虑更大。永远是 x -1;
  • 你能解释一下 arr = [...new Set(arr)] 如何过滤数组中的唯一数字吗?
  • easy Map 只能在尝试设置是否有数字超过它时具有唯一键。
【解决方案3】:

const myFunction = (arr) => {
  arr = arr
    .filter((v, i, a) => a.indexOf(v) === i) // filter unique values
    .sort() // sort if needed
    
  return [arr[1], arr[arr.length-2]]
}

const [ secondLowest, secondHighest ] = myFunction([6, 3, 6, 5, 2, 1, 2, 4])
console.log(secondLowest, secondHighest)

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2019-01-25
    • 2012-09-04
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多