首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从对象形成数据集

从对象形成数据集
EN

Stack Overflow用户
提问于 2019-08-14 11:48:26
回答 1查看 37关注 0票数 0

我试图从一个对象构造数据集,作为API的响应。

数据采用这种格式。

代码语言:javascript
复制
let assets = [
  {count: 1, skills: ["teach", "play"]},
  {count: 1, skills: ["write", "surf"]},
  {count: 2, skills: ["run", "teach"]},
  {count: 3, skills: ["teach", "run", "hike"]}
]

从上述反应中形成一系列独特的技能。

代码语言:javascript
复制
let unique = ["teach", "play", "write", "surf", "run", "hike"]

我通过运行构建了一个对象数组。

代码语言:javascript
复制
let finalObj = {};
unique.map( (skill) => {
  finalObj[skill] = assets.filter( asset => asset.skills.includes(skill) )
  .map( asset => ({skill: skill, count: asset.count}) );  
})

这是运行代码后的样子。

可能是一个可以避免的额外步骤。

代码语言:javascript
复制
finalObj = {
  teach: [{skill: teach, count: 1},{skill: teach, count: 2}, {skill: teach, count: 3}],
  play: [{skill: play, count: 1}],
  write: [{skill: write, count: 1}],
  surf: [{skill: surf, count: 1}],
  run: [{skill: run, count: 2}, {skill: run, count: 3}],
  hike: [{skill: hike, count: 3}]
}

我期待我的最终数据集是。

代码语言:javascript
复制
let data0 = [ 
  {skill: 'teach', count: 2},
  {skill: 'play', count: 1},
  {skill: 'write', count: 1},
  {skill: 'surf', count: 1},
  {skill: 'run', count: 2},
  {skill: 'hike', count: 3}
]

let data1 = [
  {skill: 'teach', count: 2},
  {skill: 'run', count: 3}
]

let data2 = [
  {skill: teach, count: 3}
]

// To find the max length of all array in finalObj
let tempLen = 0;
Object.keys(finalObj).forEach((key) => {
  if (tempLen > finalObj[key].length) {
    tempLen = tempLen
  } else {
    tempLen = finalObj[key].length
  }
})
// returns 3 - expected

这是为了展示在for循环中创建变量的一种方法,该循环使用变量名称中当前迭代的值。与实际代码无关。

代码语言:javascript
复制
for (let i = 0; i < tempLen; i++) {
  let str ="data"+ i+" = []";
  eval(str).push(i)
}
// returns data0=[0], data1=[1], data2=[2] - expected

这表明通过硬编码变量名和数组索引实现了预期的结果。在我的应用程序中没有一个场景。

代码语言:javascript
复制
let sampleData = []
Object.keys(finalObj).forEach(key => 
  sampleData.push(finalObj[key][0])
)
// returns expected data

当我用一个实际的场景来尝试时。

代码语言:javascript
复制
for (let i = 0; i < tempLen; i++) {
  let str ="data"+ i+" = []";
  Object.keys(finalObj).forEach((key) => {
    eval(str).push(finalObj[key][i])
  })
}
// not expected result
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-14 12:13:23

我使用data对象来存储所需的数组,在对象的关键迭代中,将进行检查以避免undefined elements.You需要避免eval

代码语言:javascript
复制
let assets = [{
    count: 1,
    skills: ["teach", "play"]
  },
  {
    count: 1,
    skills: ["write", "surf"]
  },
  {
    count: 2,
    skills: ["run", "teach"]
  },
  {
    count: 3,
    skills: ["teach", "run", "hike"]
  }
];

let unique = ["teach", "play", "write", "surf", "run", "hike"];

let finalObj = {};
unique.map((skill) => {
  finalObj[skill] = assets.filter(asset => asset.skills.includes(skill))
    .map(asset => ({
      skill: skill,
      count: asset.count
    }));
});

let tempLen = 0;
Object.keys(finalObj).forEach((key) => {
  if (tempLen > finalObj[key].length) {
    tempLen = tempLen
  } else {
    tempLen = finalObj[key].length
  }
})

let data = {};

for (let i = 0; i < tempLen; i++) {
  data["data" + i] = [];
  Object.keys(finalObj).forEach((key) => {
    if (finalObj[key][i])
      data["data" + i].push(finalObj[key][i])
  })
}

console.log(data);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57494109

复制
相关文章

相似问题

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