如果索引不存在,则在对象中获取数据

时间:2015-10-12 19:16:09

标签: javascript algorithm performance data-structures javascript-objects

我有一个包含这样数据的对象:

var data = {
    '4': [1, 2, 3],
    '5': [1, 2, 3],
    '6': [1, 2, 3],
    '7': [1, 2, 3],
    '8': [1, 2, 3],
    '9': [1, 2, 3],
    '10': [1, 2, 3],
    '11': [1, 2, 3],
    '12': [1, 2, 3],
    '15': [1, 9, 3],
    '18': [1, 2, 3],
    '21': [1, 8, 3],
    '24': [1, 2, 3],
    '30': [1, 2, 3],
    '36': [1, 2, 3],
    '42': [1, 20, 3]
}

现在我想访问像

这样的数据
var result = data[i][1];

这会给我9 if i = 15的结果。

但是如果给定的索引不存在,我需要始终获得下一个较低的索引。因此,如果i = 16,结果也应为9。如果i = 23结果为8i = 999结果为20。我怎么能这样做?

5 个答案:

答案 0 :(得分:4)

您将不得不向下循环搜索数组中的该属性。假设input是您要查找的那个,

for (var i = input; i > 0; i--) { // Looping incrementing down
    if (data.hasOwnProperty(i)) {
        result = data[i][1];
        break;
    }
}

hasOwnProperty方法检查您的数据数组是否具有该索引,并在设置result之后突然退出循环。

答案 1 :(得分:0)

您需要查找索引请求,如果找不到索引请求,请从索引中减去一个,然后重试。类似的东西:

function getItem(i,j) {
    if (i < 0) {
        // assuming no negative keys exists
        return null;   // or throw an error if you prefer
    }
    if (data[i]) {
        return data[i][j];
    }
    else {
         return getItem(i-1,j);
    }
}

用法:

getItem(16,1);    // should give you 9

答案 2 :(得分:0)

要将其四舍五入到最接近的数字以太方式,请尝试使用:

dism /online /Enable-Feature /FeatureName:TelnetClient

感谢:https://stackoverflow.com/a/3561328/5414240代表最近的功能。

希望这有帮助。

答案 3 :(得分:0)

对于有效的密钥,我建议

  1. 尝试密钥存在,或
  2. 获取所有密钥,将它们映射到Number,执行数字排序,并至少将数据减少到一个密钥,该密钥小于下一个更大的值。
  3. var data = { '4': [1, 2, 3], '5': [1, 2, 3], '6': [1, 2, 3], '7': [1, 2, 3], '8': [1, 2, 3], '9': [1, 2, 3], '10': [1, 2, 3], '11': [1, 2, 3], '12': [1, 2, 3], '15': [1, 9, 3], '18': [1, 2, 3], '21': [1, 8, 3], '24': [1, 2, 3], '30': [1, 2, 3], '36': [1, 2, 3], '42': [1, 20, 3] };
    
    function getKey(key) {
        return key in data ? key : Object.keys(data).map(Number).sort(function (a, b) { return a - b; }).reduce(function (r, a) {
            return a <= key ? a : r;
        });
    }
    
    document.write('3 ' + getKey(3) + '<br>');
    document.write('15 ' + getKey(15) + '<br>');
    document.write('16 ' + getKey(16) + '<br>');
    document.write('23 ' + getKey(23) + '<br>');
    document.write('999 ' + getKey(999) + '<br>');

    编辑:为了获得更好的性能,请避免检查keys数组中的所有项目。该解决方案也适用于稀疏数组,如

    var data = [];
    data[4] = [1, 2, 3];
    data[5] = [1, 2, 3];
    data[6] = [1, 2, 3];
    

    var data = { '4': [1, 2, 3], '5': [1, 2, 3], '6': [1, 2, 3], '7': [1, 2, 3], '8': [1, 2, 3], '9': [1, 2, 3], '10': [1, 2, 3], '11': [1, 2, 3], '12': [1, 2, 3], '15': [1, 9, 3], '18': [1, 2, 3], '21': [1, 8, 3], '24': [1, 2, 3], '30': [1, 2, 3], '36': [1, 2, 3], '42': [1, 20, 3] },
        keys = Object.keys(data).map(Number).sort(function (a, b) { return a - b; }),
        i;
    
    function getKey(key) {
        var lower = 0,
            upper = keys.length - 1,
            index;
    
        if (key in data) {
            return key;
        }
        if (key < keys[0]) {
            return; // this is not specified in question
        }
        if (key > keys[upper]) {
            return keys[upper];
        }
        while (lower !== upper) {
            index = lower + upper >> 1;
            if (key > keys[index]) {
                lower = index + 1;
                continue;
            }
            upper = index;
        }
        return keys[lower - 1];
    }
    
    for (i = -5; i < 50; i++) {
        document.write('value: '+ i + ', key: ' + getKey(i) + '<br>');
    }

答案 4 :(得分:0)

如果数据结构类似于稀疏数组和 如果这个数据结构的索引往往更大 整数代表,然后是&#34;尝试错误倒计时方法&#34; 逐步减少给定索引1可能不会 再好了。

以下示例尝试将此考虑在内......

var getNextLowerOrSameIndex = function (obj, idx) {
  var
    indexCount,
    listOfIndices
  ;
  idx = parseInt(idx, 10);

  if (!(idx in obj)) {
    listOfIndices = Object.keys(obj);

    idx = (listOfIndices.every(function (index, count/*, listOfIndices*/) {

      indexCount = count;
      index = parseInt(index, 10);

      listOfIndices[indexCount] = index;

      return (idx > index);

    }) && Math.max.apply(null, listOfIndices)) || listOfIndices[indexCount - 1];
  }
//return idx;
  return (Number.isFinite(idx) && idx) || (void 0);
};

...

var data = {
  '4': [1, 2, 3],
  '5': [1, 2, 3],
  '6': [1, 2, 3],
  '7': [1, 2, 3],
  '8': [1, 2, 3],
  '9': [1, 2, 3],
  '10': [1, 2, 3],
  '11': [1, 2, 3],
  '12': [1, 2, 3],
  '15': [1, 9, 3],
  '18': [1, 2, 3],
  '21': [1, 8, 3],
  '24': [1, 2, 3],
  '30': [1, 2, 3],
  '36': [1, 2, 3],
  '42': [1, 20, 3]
};

console.log(data[getNextLowerOrSameIndex(data, 4)][1]);     // 2
console.log(data[getNextLowerOrSameIndex(data, "4")][1]);   // 2
console.log(data[getNextLowerOrSameIndex(data, "5")][1]);   // 2

console.log(data[getNextLowerOrSameIndex(data, 15)][1]);    // 9
console.log(data[getNextLowerOrSameIndex(data, 16)][1]);    // 9
console.log(data[getNextLowerOrSameIndex(data, "15")][1]);  // 9
console.log(data[getNextLowerOrSameIndex(data, "17")][1]);  // 9

console.log(data[getNextLowerOrSameIndex(data, "23")][1]);  // 8
console.log(data[getNextLowerOrSameIndex(data, 999)][1]);   // 20