【问题标题】:checking if number value is within an object检查数值是否在对象内
【发布时间】:2021-03-14 22:50:49
【问题描述】:

我试图将数组中的每个数字作为键映射到空对象,并将值设置为索引。但是,第一个索引 0 被跳过了...?

function solve(nums) {

    let obj = {};
    for (let i=0; i<nums.length; i++) {
        if (!obj[nums[i]]) {  // if key does not exist, set key/value pair 
            obj[nums[i]] = i
        } else if (obj[nums[i]]) {
            obj[nums[i]] = 0  // if key exists, set to 0 
        }

    }

    console.log(obj)
}
solve([50, 30, 50, 90, 10])

【问题讨论】:

  • 它不会被跳过。你通过50 两次,但对象不能有两个相同的属性。
  • 既然已经看过了,为什么还要设置为零?

标签: javascript loops object


【解决方案1】:

一切正常。它不会被跳过。你通过50 两次但Object 不能有两个相同的属性。所以第二个50 覆盖了第一个value

当您致电solve([500, 30, 50, 90, 10])

你会得到{10: 4 30: 1 50: 2 90: 3 500: 0} 这是预期的结果。 ?

【讨论】:

  • 好的,那么我怎样才能让它不超过第一个结果呢?
  • 使用Map 而不是Object。下面@Juan 的回答。
  • 您能详细说明一下吗?
【解决方案2】:

首先,我对else if 块有点困惑,为什么你把它设置为0,如果你再次找到相同的数字。

但它被跳过了,因为您的数组中有两次50。当你循环遍历 nums 时,当你到达索引 i = 2 时,你将拥有对象 { 50: 0, 30: 1}

因此,!0 返回true,因此您将再次进入if 块,并且您将用2 覆盖键50 的值。

尝试使用具有 5 个不同值的数组,它会按您的预期工作

【讨论】:

    【解决方案3】:

    您可以改用Map。像这样的:

    function solve(nums) {
        let obj = new Map();
        for (let i=0; i<nums.length; i++) {
            if (obj.get(nums[i]) == undefined) {  // if key does not exist, set key/value pair
                obj.set(nums[i]) = i;
            } else {
                obj.set(nums[i], 0);  // if key exists, set to 0 
            }
        }
        console.log(obj);
    }
    solve([50, 30, 50, 90, 10]);
    

    更新

    看来你真正需要的是不同的东西。我将尝试更好地解释它,因为您有 2 个具有相同值 50 的数字,唯一唯一的是索引,那么您可以将索引作为键,但是,您可能只需要一个值并将两个索引都作为一个值。

    对于第一个选项,您可以使用:

    function solve(nums) {
        let obj = new Map();
        for (let i=0; i<nums.length; i++) {
            obj.set(i,nums[i]);
        }
        console.log(obj);
    }
    solve([50, 30, 50, 90, 10]);
    

    对于第二个选项,代码如下:

    function solve(nums) {
        let obj = new Map();
        for (let i=0; i<nums.length; i++) {
            if (obj.get(nums[i]) == undefined) {  // if key does not exist, set key/value pair 
                obj.set(nums[i]) = i;
            } else {
                obj.set(nums[i], obj.get(nums[i]) + ',' + i);  // if key exists, append the second index 
            }
        }
        console.log(obj);
    }
    solve([50, 30, 50, 90, 10]);
    

    【讨论】:

    • @Seb 使用Map @Juan 建议将允许您使用几个50 ?
    • 这不起作用。复制粘贴出现错误。
    • 更进一步,它仍然没有捕捉到第二个值50,并将其设置为0...
    • @Seb 我试图改进我的答案以满足您的需求,但如果您需要的不是我发布的 3 个选项,那么您应该编辑您的问题并显示您需要的示例输出
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2021-03-30
    • 2020-01-15
    • 2021-04-28
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多