【问题标题】:return array of object javascript返回对象javascript数组
【发布时间】:2016-06-16 06:26:36
【问题描述】:

有了这个数组:

var booksStudents = [
  {
   name: "David", 
   books: {
      "fantasy": 23,
      "action": 31,
      "thriller" 21,
      }
   },
   name: "Paul", 
   books: {
      "fantasy": 17,
      "action": 13,
      "thriller" 23,
      }
   },
   name: "Zoe", 
   books: {
      "fantasy": 5,
      "action": 7,
      "thriller" 28,
      }
}];

我想返回一个对象数组,每个对象都包含一个人的名字和他们所有书籍的总和。 我知道如何在一个简单的数组上使用 reduce 方法,但我被这个对象数组卡住了。 我正在考虑使用.map.reduce,但我没有找到有趣的东西。

【问题讨论】:

  • 首先用一个好的旧循环来实现它。然后将循环体提取到一个函数中。然后将循环替换为Array.prototype.map
  • 您的对象似乎遗漏了几个左大括号。
  • 可以使用许多迭代器,例如mapforEachreduce i>、reduceRight 等,但最符合语义的是 map。它将创建一个新数组,无论您的回调函数返回什么,都将其填充,然后返回。见MDN: Array.prototype.map,如果你有问题可以去发帖。
  • @RobG 他们不是“迭代器”
  • @zerkms——好的,活套? ;-)

标签: javascript arrays object methods


【解决方案1】:
booksStudents = booksStudents.map(function(item){
  var count = 0;
  for(var key in item.books){
    count+=item.books[key];
  }
  item.count = count;
  return item;
})

使用 map 和 for..in 来数数。

【讨论】:

    【解决方案2】:

    首先,您的对象数组中很少有错误,让我指出它们。

      var booksStudents = [
      {
       name: "David", 
       books: {
          "fantasy": 23,
          "action": 31,
          "thriller": 21,  // : missing
          }
       },
       {                   // { missing
       name: "Paul", 
       books: {
          "fantasy": 17,
          "action": 13,
          "thriller": 23, // : missing
          }
       },
       {                  // { missing
       name: "Zoe", 
       books: {
          "fantasy": 5,
          "action": 7,
          "thriller": 28, // : missing
          }
    }];
    

    因此,在修复此问题后,获得最终结果的解决方案是使用此代码。

    var newArray = [];
    $.each(booksStudents,function(index,value){
        var currObj = {};
        currObj.name= this.name;
        currObj.totalBooks = parseInt(this.books.fantasy) +parseInt(this.books.action)+parseInt(this.books.thriller) ;
       newArray.push(currObj);
    });
    
    console.log(newArray);
    

    这是一个Wroking Fiddle 检查控制台的输出

    输出如下。

    【讨论】:

    • 非常感谢。我不想让人讨厌,但使用 .reduce 方法让我很吃力。有可能还是我陷入了死胡同?
    • 我没有看到 jQuery 标签,所以它肯定是不需要的,因为有内置的 Array.prototype.forEach,还有 jQuery each 以不同的顺序将参数传递给回调。
    • @sylvain——你可以使用 reduce like:data.reduce(function(acc, curr) {/* do stuff, push new object onto acc*/;return acc;}, []),但 map 是更好的选择(语义更多,逻辑更简单)。
    • @RobG:谢谢。我对 reduce 方法很固执。
    • @Sylvain 所以你说你接受的答案对你很好??用你有的破碎的物体??
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多