【问题标题】:How to double the numbers in an array of objects?如何将对象数组中的数字加倍?
【发布时间】:2018-08-28 01:07:38
【问题描述】:

我想将对象数组中的键值加倍,但我总是得到列表中的最后一个 key:val。我希望能够打印将其值翻倍的整个对象数组。

doubleArr = [];

function doubleSize (a,b) {
    for(var i in a) {
        if (a.hasOwnProperty(i)) {
            var doubleObj = {};
            doubleObj[i] = b * a[i];
            var results = doubleObj[i];
            doubleArr.push(results);

        }

    }

    return doubleObj;
}

console.log(doubleSize({1:1,1:2,1:3,1:4,1:5}, 2))

我只得到{1:10}。目标是获得{1:2,1:4,1:6,1:8,1:10}。谢谢。

【问题讨论】:

  • 你返回的是doubleObj,而不是doubleArr
  • 您的对象只有一个属性,1。重复的属性会覆盖早期的值。在对象被传递给函数之前,它被评估为{ 1: 5 }
  • @Lee Taylor 但它仍然没有给我想要的结果。 DoubleArr 返回 [10]。目标是返回对象数组。
  • 首先,您没有“对象数组”
  • 这个问题不值得被否决。我还在学习。谢谢。

标签: javascript arrays loops object iteration


【解决方案1】:

您的代码的主要问题是您cannot have duplicate keys in an object。对象中的每个键都必须是唯一的;否则,您实际上是在一遍又一遍地重新声明与该键关联的值(因此,自然,在您的示例中,键 1 最终将与您为其分配的最后一个值相关联:5)。

然而,即使你使用了一个没有重复键的对象,你仍然会遇到以下问题:

  • 您的doubleArr 不应在全局范围内声明,而应在函数内声明;此外,你不需要一个数组来做你正在做的事情
  • 您的代码实际上是在构造一个对象数组,而不是一个对象。如果你想返回一个对象,你应该在你的函数中建立一个具有唯一值的对象。

这是您的代码修改版本的示例:

function doubleSize (a,b) {
    var doubleObj = {};
    for(var i in a) {
        if (a.hasOwnProperty(i)) {
            doubleObj[i] = b * a[i];
        }
    }

    return doubleObj;
}

console.log(doubleSize({1:1,2:2,3:3,4:4,5:5}, 2)) // Note the unique keys

但是,我并不完全理解对对象的需求。您可以改用数组,然后使用 Array.map 将所有代码替换为简单的单行代码:

var arr = [1, 2, 3, 4, 5]
var doubledArr = arr.map(x => 2*x) // An arrow function that multiplies each value in the array by 2
console.log(doubledArr)

【讨论】:

  • 这就是我一直在寻找的。我知道我哪里出错了。仍然有很多东西要了解对象。谢谢。
  • 我可以对数组做同样的事情,但我也希望能够对它们使用对象。
【解决方案2】:

您正在为您的对象 1 使用相同的密钥。我假设您不需要对象,因为它们不会为您的代码提供任何明显的东西:

编辑如果你坚持使用对象,我也提供了第二个版本。

function doubleSize (a,b) 
{
    var doubleArr = [];
    for(var i=0; i<a.length;i++) 
    {
        doubleArr.push(a[i]*b);
    }

    return doubleArr;
}

console.log(doubleSize([1,2,3,4,5], 2))

function doubleSize2 (a,b) 
{
    var result = {};
    for(var i in a)
    {
        result[i] = a[i]*b
    }

    return result;
}

console.log(doubleSize2({a:1,b:2,c:3,d:4,e:5}, 2))

【讨论】:

  • 是的,当我更改键并返回为 doubleArr 时,它确实有效,我得到的数字数组加倍。
  • const doubleSize = (a, b) =&gt; a.map(n =&gt; n * b) 也可以:p
【解决方案3】:

你不能在一个对象中有重复的键,但是你可以有一个具有相同键的对象数组。比如:

function doubleSize (a, b) {
  var out = [];
  for(var i = 0; i < a.length; i++) {
    out.push({'1': a[i]['1'] * b});
  }

  return out;
}

console.log(doubleSize([{'1': 1}, {'1': 2}, {'1': 3}, {'1': 4}, {'1': 5}], 2));

【讨论】:

    【解决方案4】:
    function doubleSize (a,b) {
        var midObject = {};
        for(var i in a) {
            if (a.hasOwnProperty(i)) {
                midObject[i] = b * a[i];
            }
        }
    
        return midObject;
    }
    

    console.log(doubleSize({1:1,2:2,3:3,4:4,5:5}, 5))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多