如果满足条件,则Javascript推送到数组

如果满足条件,则Javascript推送到数组,javascript,arrays,Javascript,Arrays,我的目标如下: var Foods = { "Fruits": [{ "id": "1", "Name": "Granny Smith", "Category": "1" }, { "id": "2", "Name": "Raspberries", "Category": "1" } ], "Potatoes": [{ "id": "3", "Name": "Maris Piper", "Category": "2" },

我的目标如下:

var Foods = {
  "Fruits": [{
   "id": "1",
   "Name": "Granny Smith",
   "Category": "1"
  }, {
   "id": "2",
   "Name": "Raspberries",
   "Category": "1"
   }
],
 "Potatoes": [{
   "id": "3",
   "Name": "Maris Piper",
   "Category": "2"
  }, {
   "id": "4",
   "Name": "Charlotte",
   "Category": "2"
 }]
 }
我想做的只是推送与链接传递的id匹配的产品

<a href="javascript:void(0)" class="cat" id="2" onClick="getCat(this.id)">Get Foods</a>

这就是我迄今为止所尝试的:

function getCat (id){
 result = [];
 for(let item in Foods) {
    if(Foods[item].id == id) {
        data[item].foreach(v=>result.push("<div class='box'><h2>" + 
        data[key].Name + "<br></div>"));
    }
  }
}

display();

function display() {
  alert(result);
}
函数getCat(id){ 结果=[]; 用于(将项目放入食品中){ if(食品[项目].id==id){ 数据[item].foreach(v=>result.push(“+ 数据[键]。名称+“
”); } } } 显示(); 函数显示(){ 警报(结果); } 因此,如果用户点击链接(id为2),结果数组应该包含“Charlotte”和“Maris Piper”,但我只是画了一个空白

谢谢你的帮助


Cheers

首先,
结果数组
应该在全局范围内,以便您可以在另一个函数中访问它,并且在对象中您有类别,然后每个类别在数组中都有一些数据,所以在迭代对象之后,您还需要迭代数组中的项以获得值。检查下面的代码

var result = [];
    function getCat(id){
     for(let item in Foods) {
        var foodItem = Foods[item];
        for(let i=0; i<foodItem.length; i++){
           if(foodItem[i].id == id) {
              result.push("<div class='box'><h2>" + foodItem[i].Name + "<br></div>"));
           } 
        }

      }
    }

function display() {
  alert(result);
}

display();
var结果=[];
函数getCat(id){
用于(将项目放入食品中){
var foodItem=食品[项目];

对于(让i=0;i首先,
结果数组
应该在全局范围内,以便您可以在另一个函数中访问它,并且在对象中您有类别,然后每个类别在数组中都有一些数据,所以在迭代对象之后,您还需要迭代数组中的项以获得值。检查下面的代码

var result = [];
    function getCat(id){
     for(let item in Foods) {
        var foodItem = Foods[item];
        for(let i=0; i<foodItem.length; i++){
           if(foodItem[i].id == id) {
              result.push("<div class='box'><h2>" + foodItem[i].Name + "<br></div>"));
           } 
        }

      }
    }

function display() {
  alert(result);
}

display();
var结果=[];
函数getCat(id){
用于(将项目放入食品中){
var foodItem=食品[项目];

对于(设i=0;i您在某种程度上是正确的,但是
数据
是什么?为什么不使用
结果
?您应该查看
类别
属性,而不是ID

这将起作用:

function getCat(id) {
    let result = [];

    for (let item in Foods) {
        if (Foods.hasOwnProperty(item)) {
            Foods[item].forEach((food) => {
                if (food.Category == id) {
                    result.push(food);
                }
            });
        }
    }

    console.log(result);
}

您的思路有些正确,但什么是
数据
?为什么不使用
结果
?您应该查看
类别
属性,而不是ID

这将起作用:

function getCat(id) {
    let result = [];

    for (let item in Foods) {
        if (Foods.hasOwnProperty(item)) {
            Foods[item].forEach((food) => {
                if (food.Category == id) {
                    result.push(food);
                }
            });
        }
    }

    console.log(result);
}

迭代器错误。您应该这样做:

function getCat(id){
    result = [];
    for(let item in Foods) {
        Foods[item].forEach(function(each){
            if(each.id == id) { // you cmpare to the wrong target
                // do something
            }
        });
    }
}

迭代器错误。您应该这样做:

function getCat(id){
    result = [];
    for(let item in Foods) {
        Foods[item].forEach(function(each){
            if(each.id == id) { // you cmpare to the wrong target
                // do something
            }
        });
    }
}

你很接近,但是有一个小问题:

for(let item in Foods) {
  console.log(Foods[item]);
  /*
  [{
  "id": "1",
  "Name": "Granny Smith",
 "Category": "1"
   }, {
   "id": "2",
   "Name": "Raspberries",
   "Category": "1"
   }
]
*/
因此,您正在对类别进行迭代,这些类别是数组

Foods[item].id
未定义为数组而不是乘积

var result=[];
Object.values(Foods).forEach(function(category){
 category.forEach(function(product){
   if(product.id===id){
     result.push(product);
   }
 });
});

但是,如果您经常这样做,一次创建一个产品阵列可能会更容易:

var products = Object.values(Foods).reduce((arr,cat)=>arr.concat(cat),[]);
因此,只要有人单击按钮,您就可以对其进行过滤:

var result = products.filter(product=>product.id === id);

你很接近,但是有一个小问题:

for(let item in Foods) {
  console.log(Foods[item]);
  /*
  [{
  "id": "1",
  "Name": "Granny Smith",
 "Category": "1"
   }, {
   "id": "2",
   "Name": "Raspberries",
   "Category": "1"
   }
]
*/
因此,您正在对类别进行迭代,这些类别是数组

Foods[item].id
未定义为数组而不是乘积

var result=[];
Object.values(Foods).forEach(function(category){
 category.forEach(function(product){
   if(product.id===id){
     result.push(product);
   }
 });
});

但是,如果您经常这样做,一次创建一个产品阵列可能会更容易:

var products = Object.values(Foods).reduce((arr,cat)=>arr.concat(cat),[]);
因此,只要有人单击按钮,您就可以对其进行过滤:

var result = products.filter(product=>product.id === id);


您的变量是什么
result=[]
scope?它是一个全局作用域吗?什么数据???而js是类型安全的,所以它的onclick和forEachSorry应该是一个Foods对象。我想你可能在寻找array.filter,但完全不清楚你的数据是什么样子,你想从中得到什么。你的变量是什么
result=[]
scope?它是一个全局作用域吗?什么数据???而且js是类型安全的,所以它的onclick和forEachSorry应该是一个Foods对象。我想你可能正在寻找array.filter,但完全不清楚你的数据是什么样子,你想从中得到什么。谢谢你的帮助。尝试了你的解决方案,如果我真的这样做了,请记录。写入(结果)它返回[object object],[object object]@hexana是的,它是一个对象。1)不要使用document.write 2)简单地构建一个字符串,就像你在代码中所做的那样,而不是使用它。Jonas你有没有一个例子,因为我似乎无法让它工作?谢谢你的帮助。尝试了你的解决方案,如果我使用document.write(结果)它返回[object object object],[object object]@hexana是的,它是一个对象。1)不要使用文档。写2)简单地建立一个字符串,就像你在代码中已经做的那样,而不是用它代替Jonas。你有没有一个例子,因为我似乎无法让它工作?你的意思是在食物中写
var category而不是在食物中写
,因为of对对象不起作用。@antonio smoljan of对objec不起作用ts lol。js中的一切都是一个对象。你当然是对的,但是for..of循环只支持数组之类的iterable对象,而不支持对象。@antonio smoljan lol,总是这样使用它,从来没有注意到它不起作用:/。谢谢;)没问题很好的答案我正在投票,只是想看看我是否错了:)你是想写吗<食品中的代码>变量类别
而不是食品的
因为of对对象不起作用。@antonio smoljan of对对象lol不起作用。js中的一切都是对象。你当然是对的,但是for..of循环只支持像数组这样的可重用对象,而不支持对象。@antonio smoljan lol总是这样使用它,从来没有ced认为它不起作用:/。谢谢;)没问题回答得很好我投了赞成票,只是想看看我是否错了:)