Javascript从关联数组中找到最小数字(冒泡排序方法)

0 javascript arrays sorting for-loop bubble-sort

所以我尝试将冒泡排序技术应用于关联数组.

我尝试的是制作一个普通的数组,然后应用冒泡排序.这工作,所以现在我正在尝试为我的关联数组做同样的事情,但我不明白为什么它不起作用,有人可以解释并告诉我如何做到这一点?

正常数组冒泡排序代码: < - 这个有效

var numbers= new Array()

numbers[0] = 22;
numbers[1] = 3;
numbers[2] = 65;
numbers[3] = 75;
numbers[4] = 500;
numbers[5] = 2;
numbers[6] = 44;

for(var i=0; i<numbers.length; i++)
{
    if(numbers[i] < numbers[i+1])
    {
        var tempGetal = numbers[i];
        numbers[i] = numbers[i+1];
        numbers[i+1] = tempGetal;         
    }
}

console.log("Smallest number from array is " + tempGetal);
Run Code Online (Sandbox Code Playgroud)

关联数组冒泡排序代码: < - 不起作用

var celsius= new Array()

celsius["Monday"] = 22;
celsius["Tuesday"] = 3;
celsius["Wednesday"] = 65;
celsius["Thursday"] = 75;
celsius["Friday"] = 1;
celsius["Saterday"] = 2;
celsius["Sunday"] = 44;

for(var temp in celsius)
{
    if(celsius[temp] < celsius[temp+1])
    {
        var tempGetal = celsius[temp];
        celsius[temp] = celsius[temp+1];
        celsius[temp+1] = tempGetal;
    }
}

console.log("Smallest number from this array is " + tempGetal[temp]);
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我,我试图应用的方法是否可行?

提前致谢!

JLR*_*she 7

你的尝试不起作用有几个原因,但你的假设有一个根本的缺陷:对象中属性的顺序是未定义的,所以你不应该尝试重新排列它们.

没有理由为此使用排序.只需浏览一次对象并找到最低值:

var min = Infinity;
for(var day in celsius) {
    if(celsius[day] < min) {
        min = celsius[day];
    }    
}
console.log(min);
Run Code Online (Sandbox Code Playgroud)

一个更好的解决方案:

var celsius = [];

celsius["Monday"] = 22;
celsius["Tuesday"] = 3;
celsius["Wednesday"] = 65;
celsius["Thursday"] = 75;
celsius["Friday"] = 1;
celsius["Saterday"] = 2;
celsius["Sunday"] = 44;

var min = Object
  .keys(celsius)
  .map(function(key) {
    return celsius[key];
  })
  .reduce(function(last, next) {
    return last < next ? last : next;
  }, Infinity);

console.log(min);
Run Code Online (Sandbox Code Playgroud)

您的方法的其他问题:

  • Javascript没有关联数组.您通常不应该创建一个数组并为其指定命名属性(这就是对象的用途).
  • 如果迭代一个对象for(var temp in celsius),temp将是属性名称,而不是温度或数字索引.
  • 记住前面的子弹,如果temp有值"Monday",celsius[temp + 1] = tempGetal则将赋值tempGetal给属性Monday1.