【问题标题】:how can i make my function more efficient?我怎样才能使我的功能更有效?
【发布时间】:2015-09-29 01:18:20
【问题描述】:

嘿伙计们,我写了一个比较数组值并返回最小值的函数,但我想知道是否有办法让它更高效,比如遍历所有数组(使用一个循环)并将结果放入一个新数组中或使单个数组成为单个数组的子数组等。该函数还提供正确的输出,但会打印三遍:

var nums1 = [-7528819, 3927361, -6398192];
var nums2 = [1777100, -2299720, -5566643];
var nums3 = [7188445, 3724971, 7699332];
var nums4 = [-8432528, -159836, -1604959];
var nums5 = [2764889, 4681472, 701396];
var nums6 = [-5073513, 599535, 4388457];
var nums7 = [8689640, 8028586, 1022322];
var nums8 = [-1088592, 1211232, -7868192];
var nums9 = [-5848613, -4945165, 631213];
var nums10 = [3218429, -833619, -1495854];
var nums11 = [8007060, 1637562, -7568493];
var nums12 = [-8391131, -6585338, 131787];
var nums13 = [-3957775, -9396892, -6143241];
var nums14 = [-6258442, -7829421, 3696922];
var nums15 = [2136598, 4935467, -1621605];
var nums16 = [-7162005, 9861954, 8977930];
var nums17 = [7226452, 8551594, 7006517];
var nums18 = [-1751226, -2536997, -1782251];
var nums19 = [380582, 1614389, 3272584];
var nums20 = [-8988205, -5167181, -7561034];
var nums21 = [-484059, -7160121, 4076528];
var nums22 = [1947448, -5551253, 7491190];

var numsLength = nums1.length;
var i = 0;
var minNum;

function test(arr) {
    for (i; i < numsLength; i++) {
        if (arr[0] < arr[1] && arr[2]) {
            minNum = arr[0];

        } else if (arr[1] < arr[2] && arr[0]) {
            minNum = arr[1];

        } else if (arr[2] < arr[1] && arr[0]) {
            minNum = arr[2];
        }
        console.log(minNum);
    }
}

test(nums1);

【问题讨论】:

  • 不使用i为什么会有循环?
  • 又因为console.log处于无用循环中,所以输出了3次结果...
  • 试图澄清你的问题,你是在问如何遍历 nums1..nums22 并获得一个包含每个 numsX 数组的最小数量的数组?
  • 循环没用,我明白了。对 DJ 来说,是的,这基本上就是我要问的。

标签: javascript arrays loops if-statement


【解决方案1】:

你可以使用Math.min函数。

console.log(Math.min.apply(null, nums1));

【讨论】:

    【解决方案2】:

    查看他的sn-p代码并阅读内联cmets:

    var nums = [];
    
    // I'm pushing only 3 sets of data, but there can be any number
    // Also there can be any number of elements in each array as you can see
    nums.push([-7528819, 3927361, -6398192]);
    nums.push([1777100, -2299720, -5566643, 380582]);
    nums.push([7188445, 3724971, 7699332, 1947448, -5551253, 7491190]);
    
    function produceResults(nums) {
        var i,
            results = [];
    
        // gathering results
        for (i = 0; i < nums.length; i++) {
            results.push(Math.min.apply(null, nums[i]));
        }
    
        return results;
    }
    
    console.log(produceResults(nums));
    

    所以 2 条建议:

    1. 使用更动态的结构(数组的数组)而不是 定义 22 个数组。
    2. 使用内置的 JS 函数和组件 (Math.min)

    【讨论】:

    • 在您的示例中,如何将数字输入到形成的数组中?
    • @KeithGray 我编辑了我的答案 - 希望它现在更干净。您可以将此代码直接粘贴到 JS 控制台(例如在 Chrome Web 开发工具中)以查看输出。
    【解决方案3】:

    在大多数情况下,展开循环实际上是循环的最有效实现。然而,实际上,展开循环通常是不可行的。使用一个小的、固定大小的数组,就像你在这里所拥有的那样,循环的每个排列都是显而易见的,如果你的目标是原始速度,你就无法比现有的效率高得多。话虽如此,正如其他人指出的那样,您的函数中的循环是无用的,因为您基本上已经展开了循环。 if 语句的语法也不正确,并且您没有处理数组中的值相等的情况。对于大小为 3 的固定数组,您需要更多...

    if (val1 <= val2 && val1 <= val3) {
        minVal = val1;
    } else if (val2 <= val1 && val2 <= val3) {
        minVal = val2;
    } else minVal = val3;
    

    现在,如果您想对任何大小数组的最小值进行任意搜索,您可以执行类似的操作,但使用循环,例如...

    var minVal = null;
    
    for (var i = 0; i < arr.length; i++) {
        if (minVal === null || minVal > (val = arr[i]))
            minVal = val;
    }
    

    根据您实际想要完成的任务以及数组的大小,对数组进行排序并从排序后的数组中重新运行最小值(0 索引)可能是有意义的。如果你走那条路,从谷歌搜索“排序算法”开始

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 2015-12-23
      • 1970-01-01
      • 2016-05-08
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多