我试图从一个对象构造数据集,作为API的响应。
数据采用这种格式。
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}) );
})这是运行代码后的样子。
可能是一个可以避免的额外步骤。
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}]
}我期待我的最终数据集是。
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循环中创建变量的一种方法,该循环使用变量名称中当前迭代的值。与实际代码无关。
for (let i = 0; i < tempLen; i++) {
let str ="data"+ i+" = []";
eval(str).push(i)
}
// returns data0=[0], data1=[1], data2=[2] - expected这表明通过硬编码变量名和数组索引实现了预期的结果。在我的应用程序中没有一个场景。
let sampleData = []
Object.keys(finalObj).forEach(key =>
sampleData.push(finalObj[key][0])
)
// returns expected data当我用一个实际的场景来尝试时。
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发布于 2019-08-14 12:13:23
我使用data对象来存储所需的数组,在对象的关键迭代中,将进行检查以避免undefined elements.You需要避免eval
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);
https://stackoverflow.com/questions/57494109
复制相似问题