【问题标题】:How to use two integers as a key如何使用两个整数作为键
【发布时间】:2017-11-12 15:54:57
【问题描述】:

我有一个记忆问题。在两个对象之间计算了一个值,我想存储它,这样我就可以从对象中传入两个数字 id 以获取值,而不管我传入 id 的顺序如何。

我可以将它存储在两个 id 下,或者检查两个 id,但出于好奇,我想知道是否有更有效的解决方案。

例子:

检查两个 id:

var storedValues = {};
function generateValue(a, b)
{
    if (storedValues[a.id][b.id])
        return storedValues[a.id][b.id];
    else if (storedValues[b.id][a.id])
        return storedValues[b.id][a.id];
    else
        // Generate value, store it under a.id and return it
}

将其存储在两个 id 下:

var storedValues = {};
function generateValue(a, b)
{
    if (storedValues[a.id][b.id])
        return storedValues[a.id][b.id];
    else
        // Generate value, store it under a.id and b.id and return it
}

如何从两个数字生成唯一的映射键,这样我就可以使用这两个数字检索值,而不管传递它们的顺序如何?

顺便说一句,我正在使用 JavaScript。

【问题讨论】:

  • 请添加一些数据来说明问题。也许您也可以添加一些您尝试过的代码。
  • 我已经编辑过了。

标签: javascript collections key


【解决方案1】:

有很多方法,首先,您可以为 objectkey 创建一个键,例如:'11_12'

var storedValues= {};
var id1  = 11;
var id2  = 12;
var calculatedvalue = id1  * id2;
var objectkey = id1+'_'+id2;
storedValues[objectkey] = calculatedvalue;

也可以使用嵌套对象:

var storedValues= {};
var id1  = 11;
var id2  = 12;
var calculatedvalue = id1  * id2;
if (storedValues[id1] == null ){
    storedValues[id1] = {};
}
storedValues[id1][id2] = calculatedvalue;

你的 ids 总是整数,你可以使用数组

var storedValuesArr = [];
var id1  = 11;
var id2  = 12;
var calculatedvalue = id1  * id2;
if (!Array.isArray(storedValuesArr[id1])){
    storedValuesArr[id1] = [];
}
storedValuesArr[id1][id2] = calculatedvalue;

并且为了返回值而不考虑顺序:

function generateValue(a, b)
{
    if (storedValues[a.id] != null && storedValues[a.id][b.id] !== null)
        return storedValues[a.id][b.id]
    else if (storedValues[b.id] != null && storedValues[b.id][a.id] !== null)
        return storedValues[b.id][a.id];
    else
        // Generate value, store it under a.id and return it
}

【讨论】:

  • 我想你误解了我的问题。如果您以正确的顺序传递函数中的对象,第一个仅返回该值,否则它会以另一个顺序再次存储它。我已经在使用嵌套集合,我更正了我的示例。
  • 啊,所以,只有同时检查两个组合才有可能
【解决方案2】:

您可以对键进行排序以设置值和获取值。

function getValue(object, key0, key1) {
    return [key0, key1]
        .sort((a, b) => a - b)
        .reduce((o, k) => (o || {})[k], object);
}

function setValue(object, key0, key1, value) {
    var keys = [key0, key1].sort((a, b) => a - b),
        last = keys.pop();
    object[keys[0]] = object[keys[0]] || {};
    object[keys[0]][last] = value;
}

var object = {};

setValue(object, 3, 7, 42);
console.log(getValue(object, 3, 7));
console.log(getValue(object, 7, 3));
console.log(object);

使用给定键的不同方法。

function getValue(object, key0, key1) {
    return key0 in object ? object[key0][key1] : object[key1][key0];
}

function setValue(object, key0, key1, value) {
    object[key0] = object[key0] || {};
    object[key0][key1] = value;
}

var object = {};

setValue(object, 3, 7, 42);
console.log(getValue(object, 3, 7));
console.log(getValue(object, 7, 3));
console.log(object);

【讨论】:

  • 显而易见的解决方案是检查两个 id。我并不不愿意这样做,我只是在寻找一种更有效的方法。我非常怀疑这是否更有效。
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多