首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据分配给for中的对象

将数据分配给for中的对象
EN

Stack Overflow用户
提问于 2019-01-22 23:21:58
回答 2查看 45关注 0票数 0

我正在尝试将我的循环数据添加到对象中。

代码语言:javascript
复制
subItem.allAvgObj = {};

for(var i = 0; i < subItem.implementations.length; i++) {

if (subItem.implementations[i].avg_score) {

        Object.assign(subItem.allAvgObj, {
          scoreAvg: subItem.implementations[i].avg_score,
          scorePonderation: subItem.implementations[i].ponderation,
        })

    }
}

只是,我的循环中只有最后一个对象是赋值的。

代码语言:javascript
复制
{
 "scoreAvg": 8,
 "scorePonderation": 10
}

我尝试使用一个数组,它可以工作(但它是一个只有一个值的数组,但是循环可以工作)

代码语言:javascript
复制
subItem.allAvgArray.push(subItem.implementations[i].avg_score);

返回:

代码语言:javascript
复制
[
  13.5,
  16,
  8
]

我怎么才能做出这样的对象呢?

代码语言:javascript
复制
{
  "scoreAvg": 13.5,
  "scorePonderation": 20
},
{
  "scoreAvg": 16,
  "scorePonderation": 20
},
{
  "scoreAvg": 8,
  "scorePonderation": 10
}

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-01-22 23:29:02

创建对象数组的一种更简单的方法可能是使用.filter()删除那些没有avg_score()的对象,然后使用.map()从每个项目中创建结果对象。

代码语言:javascript
复制
let result = subItem.implementations
  .filter(i => i.avg_score)
  .map(i => ({
    scoreAvg: i.avg_score,
    scorePonderation: i.ponderation
  }));

代码语言:javascript
复制
const subItem = {
  implementations: [{
      avg_score: 15.7,
      ponderation: 20
    },
    {
      avg_score: 0,
      ponderation: 15
    }, {
      avg_score: 6.8,
      ponderation: 10
    }
  ]
}

let result = subItem.implementations
  .filter(i => i.avg_score)  //remove items without avg_score
  .map(i => ({               //turn the remaining items into objects
    scoreAvg: i.avg_score,
    scorePonderation: i.ponderation
  }));
  
console.log(result);

或者,对于一次性解决方案,则为reduce()

代码语言:javascript
复制
let result = subItem.implementations
  .reduce((acc,i) => 
    i.avg_score 
      ? [...acc, {scoreAvg: i.avg_score, scorePonderation: i.ponderation}] 
      : acc
  ,[]);

代码语言:javascript
复制
const subItem = {
  implementations: [{
      avg_score: 15.7,
      ponderation: 20
    },
    {
      avg_score: 0,
      ponderation: 15
    }, {
      avg_score: 6.8,
      ponderation: 10
    }
  ]
}

let result = subItem.implementations
  .reduce((acc,i) => 
    i.avg_score  //if avg_score, add an object. else, do nothing.
      ? [...acc, {scoreAvg: i.avg_score, scorePonderation: i.ponderation}] 
      : acc
  ,[]);

console.log(result);

请注意,reduce()解决方案在性能上弥补了可读性方面的不足。

票数 4
EN

Stack Overflow用户

发布于 2019-01-22 23:27:09

Object.assign用于浅层合并对象,而不是创建您想要的对象数组。

尝试:

代码语言:javascript
复制
subItem.allAvgObj = [];

for(var i = 0; i < subItem.implementations.length; i++) {

if (subItem.implementations[i].avg_score) {

        subItem.allAvgObj.push({
          scoreAvg: subItem.implementations[i].avg_score,
          scorePonderation: subItem.implementations[i].ponderation,
        })

    }
}

预期输出应为:

代码语言:javascript
复制
[
    {
      "scoreAvg": 13.5,
      "scorePonderation": 20
    },
    {
      "scoreAvg": 16,
      "scorePonderation": 20
    },
    {
      "scoreAvg": 8,
      "scorePonderation": 10
    }
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54311387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档