我将参考以下内容: 测试对象 物种对象。
在“物种”对象中,我有两个属性:“物种”和“状态”。 “ state”属性的值是一个带有状态的数组。 我想为“测试”对象创建一个键,该键对应于位于对象种类对象中的“状态”数组内的每个状态。
示例输出(查看下面的代码以查看这些值来自何处):
{a: ["tiger", "dog"], b: ["tiger"], c: ["dog","lion"], d: ["tiger", "dog"], e: ["lion:]}
这个想法是我想列出每个州内的物种,并且物种通常不限于一个州,因此肯塔基州的一个物种也可能在俄亥俄州被发现。我希望以上述方式将该物种列为两个州的居民。
我收到的错误如下:
Uncaught (in promise) TypeError: test[d].append is not a function
at script.js:272
at Array.forEach (<anonymous>)
at runVis (script.js:270)
at script.js:178
这是我的代码:
var test = new Object();
var species = [{species: "tiger", state: ["a","b","d"]},
{species: "dog", state: ["a","c","d"]},
{species: "lion", state: ["c", "e"]}
];
for (i in species) {
species[i].state.forEach(function(d) {
if (d in test) {
test[d].append(species[i].species)
}
else {
test[d] = [species[i].species];
console.log(test);
}
})
}
如果状态不存在,我会为其创建一个密钥。我也第一次将该状态的种类的值存储在数组中。当我遇到一个存在于具有键的状态的物种时,我想将该物种附加到状态键值的数组上。
答案 0 :(得分:2)
是push
而不是append
:
for (i in species) {
species[i].state.forEach(function(d) {
if (d in test) {
test[d].push(species[i].species)
} else {
test[d] = [species[i].species];
console.log(test);
}
})
}
您也可以像这样使用reduce
:
var species = [{species: "tiger", state: ["a","b","d"]},{species: "dog", state: ["a","c","d"]},{species: "lion", state: ["c", "e"]}];
var test = species.reduce((acc, { species, state }) => {
state.forEach(s => {
acc[s] = acc[s] || [];
acc[s].push(species);
});
return acc;
}, {});
console.log(test);
.as-console-wrapper { max-height: 100% !important; top: auto; }