[英]Looping through JSON objects in Array
我试图用对象遍历这个数组,但我相信我遗漏了一些东西。 基本上,我正在检查我的 fav 数组是否具有来自公司数组的“text”关键字。 最终的 JSON 对象应该如下所示(JSON 对象是两个公司,因为福特不在 fav 数组中)。 我的解决方案中缺少什么https://jsfiddle.net/netchi/rsam2k9h/5/
{
text: "Toyota",
origin: "Japan",
icon: "icon"
},
{
text: "Honda",
models: "12",
}
这是您正在寻找的代码:
var fav = ["Toyota", "Honda"];
var companies = [
Toyota = {
text: "Toyota",
origin: "Japan",
icon: "icon"
},
Ford = {
text: "Ford",
founder: "Henry Ford",
icon: "icon"
},
Honda = {
text: "Honda",
models: "12"
}]
//check if fav includes the text from companies array. If it does then push JSON
let finalJson = [];
companies.forEach(company => {
if (fav.includes(company.text)) {
finalJson.push(company);
}
});
console.log(finalJson);
问题是您试图使用 forEach 方法遍历对象而不是数组。 所以我以正确的方式重新制作了“公司”数组。
您没有将它们添加到带有索引的数组中,因为使用点添加值通常表示对象键。 通过推送数组中的值,它们被添加为索引,现在您可以遍历它们。 下面你可以看到我们是否使用 dot 插入数组,它转换为一个对象,你可以使用 typeof 来识别它。
正确的方法是使用push方法将数据插入数组。
var companies = [];
var fav = ["Toyota", "Honda"];
companies.push({
text: "Toyota",
origin: "Japan",
icon: "icon"
})
companies.push({
text: "Ford",
founder: "Henry Ford",
icon: "icon"
})
companies.push({
text: "Honda",
models: "12"
})
//check if fav includes the text from companies array. If it does then push JSON
let finalJson = [];
console.log(companies)
companies.forEach(company => {
console.log(company)
if (fav.includes(company.text)) {
finalJson.push(company);
}
});
console.log(companies, finalJson);
如果你想用对象键循环,有几种方法可以用 Es 来做到这一点
for (const value of Object.values(companies)) {
console.log(value.text);
}
或使用 Es6
Object.keys(companies).forEach(e => console.log(`${e}`));
https://jsfiddle.net/srividhyar25/t1urg9kw/16/
如果您想使用“Honda”、“Toyato”作为键,则必须使用该对象。 或者您应该将对象推送给公司。
var companies = {};
var fav = ["Toyota", "Honda"];
companies['Toyota'] = {
text: "Toyota",
origin: "Japan",
icon: "icon"
};
companies['Ford'] = {
text: "Ford",
founder: "Henry Ford",
icon: "icon"
};
companies['Honda'] = {
text: "Honda",
models: "12"
};
//check if fav includes the text from companies array. If it does then push JSON
let finalJson = [];
for(const company in companies) {
if (fav.includes(company)) {
finalJson.push(companies[company]);
}
}
console.log(finalJson);
您的问题似乎是将companies
定义为一个对象(使用点符号来分配其与公司名称相对应的属性),但稍后您尝试应用Array.prototype.forEach()
这对对象不起作用。
相反,(如果companies
实际上是一个对象)您需要提取其值(使用Object.values()
)并将Array.prototype.filter()
与Array.prototype.includes()
一起应用以提取数据fav
存在的text
值:
const fav = ["Toyota", "Honda"], companies = {Toyota:{text:"Toyota",origin:"Japan",icon:"icon"},Ford:{text:"Ford",founder:"Henry Ford",icon:"icon"},Honda:{text:"Honda",models:"12"}} result = Object.values(companies).filter(({text}) => fav.includes(text)) console.log(result)
.as-console-wrapper{min-height:100%;}
但是,只要companies
实际上是一个以公司名称为键的对象,您就可以直接使用它:
const fav = ["Toyota", "Honda"], companies = {Toyota:{text:"Toyota",origin:"Japan",icon:"icon"},Ford:{text:"Ford",founder:"Henry Ford",icon:"icon"},Honda:{text:"Honda",models:"12"}} result = Object .entries(companies) .reduce((r,[companyName,companyData]) => (fav.includes(companyName) && r.push(companyData), r), []) console.log(result)
.as-console-wrapper{min-height:100%;}
但是,如果您最初的意图是将companies
作为数组(而不是对象),您可以立即应用filter()
:
const fav = ["Toyota", "Honda"], companies = [{text:"Toyota",origin:"Japan",icon:"icon"},{text:"Ford",founder:"Henry Ford",icon:"icon"},{text:"Honda",models:"12"}] result = companies.filter(({text}) => fav.includes(text)) console.log(result)
.as-console-wrapper{min-height:100%;}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.