【问题标题】:Find closest integer in Object在 Object 中查找最接近的整数
【发布时间】:2017-03-27 21:33:26
【问题描述】:

正如标题所说,我正在尝试在一个对象中找到最接近的整数,我的数据以下列方式存储,我无法更改它的存储方式。

{"response":
    {"success":1,"current_time":1490650140,"items":
        {"AK-47 | Aquamarine Revenge (Battle-Scarred)":{"last_updated":1490648718,"quantity":98,"value":1120},
        "AK-47 | Aquamarine Revenge (Factory New)":{"last_updated":1490648718,"quantity":47,"value":3229},
        "AK-47 | Aquamarine Revenge (Field-Tested)":{"last_updated":1490648718,"quantity":159,"value":1623}
        }
    }
}

我想找到最接近给定数字 (x) 的项目。如果物品的价值相等,则应该选择其中一个。我知道我需要一个循环,但我不知道从哪里开始。

我正在尝试在 obj 中找到与 value 最接近的整数 x。

【问题讨论】:

  • 所以引用数组,做一个for循环。存储该值,如果较低,则覆盖并存储下一个值。
  • 这就是我的想法,但没有更有效的方法吗..?
  • 这组data 似乎是awfully popular
  • 哪些整数是相关的?例如,1success 值是否可以考虑? last_updated 值呢?还是AK-47 中的47
  • 您为什么不尝试自己编写代码呢? Stack Overflow 不是代码编写服务。

标签: javascript loops object


【解决方案1】:

您可以在对象上使用for..in,或使用数组迭代方法for.forEach 等,通过使用Object.keys(data.response.items)(这将为您提供一个对象键数组)。

const data = {"response":
    {"success":1,"current_time":1490650140,"items":
        {"AK-47 | Aquamarine Revenge (Battle-Scarred)":{"last_updated":1490648718,"quantity":98,"value":1120},
        "AK-47 | Aquamarine Revenge (Factory New)":{"last_updated":1490648718,"quantity":47,"value":3229},
        "AK-47 | Aquamarine Revenge (Field-Tested)":{"last_updated":1490648718,"quantity":159,"value":1623}
        }
    }
};
const target = 1344;

function findClosestForIn(items, target) {
    let closestVal = Infinity;
    let closestObj = null;

    for (let key in items) {
        let obj = items[key];
        let curDiff = Math.abs(obj.value - target);

        if (curDiff < closestVal) {
          closestVal = curDiff;
          closestObj = obj;
        }
    }

    return closestObj;
}

function findClosestObjectKeys(items, target) {
    let closestVal = Infinity;
    let closestObj = null;

    Object.keys(data.response.items).forEach((key) => {
        const obj = data.response.items[key];
        const curDiff = Math.abs(obj.value - target);

        if (curDiff < closestVal) {
          closestVal = curDiff;
          closestObj = obj;
        }
    });

    return closestObj;
}


console.log('closest using for..in: ', findClosestForIn(data.response.items, target));
console.log('closest using Object.keys: ', findClosestObjectKeys(data.response.items, target));

【讨论】:

    【解决方案2】:

    您将需要一个变量来存储最接近的匹配项。

    你可以使用JsonObject来处理json的解析。

    将第一个条目加载到变量中。 循环遍历其余条目,并根据先前存储的条目检查每个条目。如果它更接近您的搜索图,请将存储的一个替换为这个。

    这与查找列表中的最大值或最小值基本相同,只是您使用不同的公式来决定何时将先前存储的值替换为新值。

    【讨论】:

    • 好的,我明白了,但是如何检查一个整数是否比另一个整数更接近。
    • if (Math.abs(searchValue - thisJsonObject.getInt("last_update")
    • 我无法解决问题,我正在尝试通过 int 获取 json 对象,但它似乎根本不起作用。
    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2015-05-19
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多