在javascript对象中找到最接近的“key”

时间:2013-08-23 19:46:20

标签: javascript object

我正在使用javascript对象,虽然我有一个解决方案但我无法帮助,但认为它可以更有效地完成。

该对象从ajax调用返回到php脚本

r.price_array[1] = 39.99
r.price_array[5] = 24.99
r.price_array[10] = 19.99
and so on....

我现在正在做的是在键值之间搜索(键值表示数量)

qty = $(this).val();

if (qty >= 1 && qty <= 4){
    price_set = 1;
}
else if (qty >= 5 && qty <= 9){
    price_set = 15;
}
else if (qty >= 10 && qty <= 14){
    price_set = 25;
}

//等等......

console.log(r.price_array[price_set]); //this returns the value

有没有办法取3的数量并找到下一个最低的关键匹配,即1? 或数量为7并找到关键5?

5 个答案:

答案 0 :(得分:2)

当然 - 只需使用循环:

var price_array = {
    1: 39.99,
    5: 24.99,
   10: 19.99,
   15: 15.99,
   20: 10.99,
   25:  5.99,
   30:  0.99
}
var qty = 12;

var maxKey = -1;
for (var key in price_array) {
    if (maxKey < 0 || key < qty) {
        maxKey = Math.max(maxKey, key);
    }
}
console.log(maxKey); //10
console.log(price_array[maxKey]); //19.99

答案 1 :(得分:2)

我的版本(测试过,小提琴在这里:http://jsfiddle.net/fred02138/UZTbJ/):

// assume keys in rprice object are sorted integers
function x(rprice, qty) {
    var prev = -1;
    var i;
    for (i in rprice) {
        var n = parseInt(i);
        if ((prev != -1) && (qty < n))
            return prev;
        else 
            prev = n;
    }    
}

var rprice = {
    1: 39.99,
    5: 24.99,
    10: 19.99
}

alert(x(rprice, 3));
alert(x(rprice, 7));

答案 2 :(得分:1)

另一种方法,在 this Fiddle

中演示
var lowerKeyFinder = function(prices) {
    var keys = Object.keys(prices);
    keys.sort(function(a, b) {return a - b;});

    return function(val) {
        var maxKey = -1;
        for (var i = 0, len = keys.length; i < len; i++) {
            if (maxKey < 0 || keys[i] < val) {
                maxKey = Math.max(maxKey, keys[i]);
            }
        }
        return maxKey;
    };
};

var lookup = lowerKeyFinder(r.price_array);

lookup(3);  //=> 1
lookup(7);  //=> 5

这并不是坚持按键最初按顺序显示,而是将它们排序一次。它建立在@ h2ooooooo的答案之上,但工作方式略有不同,因为它最终提供了一个简单的函数来查找数量。

答案 3 :(得分:0)

这是执行此操作的功能。它希望用于具有数字键的对象,如数组:

function getClosestKey(arr, target, u){
  if(arr.hasOwnProperty(target))
    return target;

  var keys = Object.keys(arr);
  keys.sort(function(a,b){ return a-b; });

  // Can replace linear scan with Binary search for O(log n) search
  // If you have a lot of keys that may be worthwhile
  for(var i = 0, prev; i < keys.length; i++){
    if(keys[i] > target)
      return prev === u ? u : +prev;
    prev = keys[i];
  }
  return +keys[i - 1];
}

您必须在旧版浏览器中使用SHIM Object.keys:

Object.keys = Object.keys || function(obj){
  var result = [];
  for(var key in obj)
    if(obj.hasOwnProperty(key)) result.push(key);
  return result;
}

用法:

var price_array = [];
price_array[1] = 39.99;
price_array[5] = 24.99;
price_array[10] = 19.99;

getClosestKey(price_array, 0); // undefined
getClosestKey(price_array, 1); // 1
getClosestKey(price_array, 3); // 1
getClosestKey(price_array, 4); // 1
getClosestKey(price_array, 5); // 5
getClosestKey(price_array, 7); // 5
getClosestKey(price_array, 9); // 5
getClosestKey(price_array, 10); // 10
getClosestKey(price_array, 100); // 10

答案 4 :(得分:0)

您可以使用Math.round()和一些简单的除法来舍入到最接近的5的倍数:

var price_array = {};
price_array[1] = 39.99;
price_array[5] = 24.99;
price_array[10] = 19.99;

function qty_round(qty) {
  // Math.max() is used to enforce a minimum quantity of 1
  return Math.max(1, 5 * Math.round(qty / 5));
}

console.log(price_array[qty_round(1)]);  // 39.99
console.log(price_array[qty_round(4)]);  // 24.99
console.log(price_array[qty_round(9)]);  // 19.99
console.log(price_array[qty_round(10)]); // 19.99

通过一些小修改,您可以向下舍入而不是向上(使用Math.floor代替Math.round)或强制执行最大数量。