繁体   English   中英

循环遍历数组中的 JSON 对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM