【问题标题】:Get "next" numeric value in object获取对象中的“下一个”数值
【发布时间】:2015-05-06 13:44:55
【问题描述】:

我有一个这样的对象:

var rock = {
 5: 0.5,
 0: 0.8,
 10: 0.3,
 2: 1.0,
}

我有一个像4.3 这样的数字,我需要前后数字的索引和值。在这个例子中,我会得到

var timeA = 2;
var valueA = 1.0
var timeB = 5;
var valueB = 0.5;

我的第一个想法是类似于 for 循环,但我不知道如何确保它的顺序正确。

【问题讨论】:

  • 你有一个对象,所以你的值的顺序不能保证。
  • @Ja͢ck 那是我的问题。

标签: javascript sorting object


【解决方案1】:

你可以这样做:

for (var i in rock) {
    if (rock.hasOwnProperty(i) && rock[i] !== null) {
        var val = rock[i];
        console.log("rock["+i+"] = ", val);
    }
};

但是 JS 对象本身并不是排序的。您可能想查看this question 以了解它的工作原理以及您可以做些什么。

【讨论】:

  • rock 是对象,而不是数组,所以它没有方法 forEach
  • 对象没有forEach 方法
【解决方案2】:

由于无法保证对象的键顺序,您必须遍历所有键并计算出最接近的较低和较高值:

var rock = {
 0: 0.8,
 2: 1.0,
 5: 0.5,
 10: 0.3
};

var max = Infinity, min = -Infinity;
var to_find = 4.3;

Object.keys(rock).forEach(function(k) {
  var value = +k;

  if (value <= to_find && value > min) {
      min = value;
  } else if (value >= to_find && value < max) {
      max = value;
  }
});

console.log(min, rock[min], max, rock[max]); // 2, 1, 5, 0.5

请注意,之后minmax 可能仍具有它们的原始值,即-InfinityInfinity,在这种情况下,undefined 将在用作rock 的键时产生。

【讨论】:

    【解决方案3】:

    您可以在 javascript 中使用 for..in (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) 循环来循环访问对象的属性。使用它,您可以根据给定值测试属性name。拥有这两个属性后,您可以使用它们作为索引来访问属性值。

    var given = 4.3;
    var timeA = null;
    var timeB = null;
    for(var e in rock){
        if(e > given){
            timeB = e;
            break;
        }
        timeA = e;    
    }
    var valueA = rock[timeA];
    var valueB = rock[timeB];
    

    JSFiddle:http://jsfiddle.net/x4hzetw7/

    如果您希望这项工作如您所愿,那么您必须找到一种对属性进行排序的方法。为此,您可以点击先前答案之一的链接(使用Object.keys(obj))。

    var given = 4.3;
    var timeA = null;
    var timeB = null;
    var keys = Object.keys(rock);
    var sorted = keys.map(Number).sort(function(a,b) {return a[0]-b[0];});
    for(var i = 0; i < sorted.length; i++){
        var e = keys[i];
        if(e > given){
            timeB = e;
            break;
        }
        timeA = e;    
    }
    var valueA = rock[timeA];
    var valueB = rock[timeB];
    

    更新的 JSFiddle:http://jsfiddle.net/x4hzetw7/5/

    【讨论】:

    • 这假设键从最低到最高排序,但这不能保证。
    • 既然您使用的是Object.keys(),您不妨使用Array.prototype.map() 等代替下划线:)
    • @Ja͢ck 感谢您的帮助,我觉得此时您的答案应该被接受,因为您基本上都写了。
    • 感谢您的投票 :) 哦,您应该使用 .map(Number) 而不是 .map(parseInt)
    • 是的,您必须使用Number。如果您使用parseInt,您将得到不正确的结果,因为后者将尝试使用传递给回调的所有三个参数。
    猜你喜欢
    • 2012-09-12
    • 2021-09-02
    • 2022-01-23
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多