Javascript 在(多维)$中传递对象。每个对象在闭包外部运行

Javascript 在(多维)$中传递对象。每个对象在闭包外部运行,javascript,jquery,loops,multidimensional-array,each,Javascript,Jquery,Loops,Multidimensional Array,Each,我想将产品对象从$.each(函数内部)循环传递到闭包外部的函数 当I console.log记录产品(对象)时,它会给我: “未捕获引用错误:未定义产品” 这是我的密码,请告诉我遗漏了什么: function openMenu(url){ // get feed from API $.getJSON(url, function(storedata) { $('#live-menu').addClass('active'); $('.live-menu-

我想将产品对象从$.each(函数内部)循环传递到闭包外部的函数

当I console.log记录产品(对象)时,它会给我:

“未捕获引用错误:未定义产品”

这是我的密码,请告诉我遗漏了什么:

function openMenu(url){

    // get feed from API
    $.getJSON(url, function(storedata) {
      $('#live-menu').addClass('active');
      $('.live-menu-content').addClass('active');

      // each the feed data
      $.each(storedata, function(categoryName, productObject){
        // category title and open table
        $('.live-menu-content').append('<h1 class="menu-category-title">'+categoryName+'</h1>');
        $('.live-menu-content').append('<table class="table table-'+categoryName+'"><tbody>');

        //go through products
        $.each( productObject, function( productId, product ) { j++;
          $('.table-'+categoryName+'').append('<tr><td>'+product.name+'<br/><small>'+product.description+'</small></td><td>€'+product.price+'</td><td><a onclick="addToCart(product);" class="btn btn-primary pull-right" href="#">Add</a></td></tr>');
        });

        // close table
        $('.live-menu-content').append('</tbody></table>');
      });

    })
    // on fail
    .fail(function() {
      alert( "Error!" );
    });
    return false;
  }

  function addToCart(product){
    console.log(product);
    return false;
  };
函数openMenu(url){
//从API获取提要
$.getJSON(url、函数(storedata){
$(“#实时菜单”).addClass(“活动”);
$('.live菜单内容').addClass('active');
//每个人都需要输入数据
$.each(存储数据、函数(categoryName、productObject){
//类别标题和打开表
$('.live菜单内容')。追加(''+categoryName+'');
$('.live菜单内容')。附加('');
//检查产品
$.each(productObject,function(productId,product){j++;
$('.table-'+categoryName+'').append(''+product.name+'
'+product.description+'欧元'+product.price+''); }); //闭桌 $('.live菜单内容')。附加(''); }); }) //失败时 .fail(函数(){ 警报(“错误!”); }); 返回false; } 功能addToCart(产品){ 控制台日志(产品); 返回false; };
我想您已经意识到了这一点,但是您的
产品
仅在您的
每个
功能范围内定义。该产品用于呈现DOM元素。而不是呈现实际产品,而是呈现文本字符串“product”,它不存在于循环范围之外。单击DOM元素时,单击事件位于完全独立的范围内。您可以将产品的id传递给函数吗?然后在处理函数中查找产品?您还需要创建一个全局
存储
对象,以便以后引用它:

var store;
function openMenu(url){

    // get feed from API
    $.getJSON(url, function(storedata) {
      store = storedata; //assign to global object
      $('#live-menu').addClass('active');
      $('.live-menu-content').addClass('active');

      // each the feed data
      $.each(storedata, function(categoryName, productObject){
        // category title and open table
        $('.live-menu-content').append('<h1 class="menu-category-title">'+categoryName+'</h1>');
        $('.live-menu-content').append('<table class="table table-'+categoryName+'"><tbody>');

        //go through products
        $.each( productObject, function( productId, product ) { j++;
          $('.table-'+categoryName+'').append('<tr><td>'+product.name+'<br/><small>'+product.description+'</small></td><td>€'+product.price+'</td><td><a onclick="addToCart("' + productId + '");" class="btn btn-primary pull-right" href="#">Add</a></td></tr>');
        });

        // close table
        $('.live-menu-content').append('</tbody></table>');
      });

    })
    // on fail
    .fail(function() {
      alert( "Error!" );
    });
    return false;
  }

  function addToCart(productId){
    var product = store.filter(function(category, catIndex){
        return category.filter(function(product, prodIndex){
            return (prodIndex == productId);
        });
    });
    console.log(product);
    return false;
  };
var存储;
函数openMenu(url){
//从API获取提要
$.getJSON(url、函数(storedata){
store=storedata;//分配给全局对象
$(“#实时菜单”).addClass(“活动”);
$('.live菜单内容').addClass('active');
//每个人都需要输入数据
$.each(存储数据、函数(categoryName、productObject){
//类别标题和打开表
$('.live菜单内容')。追加(''+categoryName+'');
$('.live菜单内容')。附加('');
//检查产品
$.each(productObject,function(productId,product){j++;
$('.table-'+categoryName+'').append(''+product.name+'
'+product.description+'欧元'+product.price+''); }); //闭桌 $('.live菜单内容')。附加(''); }); }) //失败时 .fail(函数(){ 警报(“错误!”); }); 返回false; } 函数addToCart(productId){ var product=store.filter(函数(类别,catIndex){ 退货类别.过滤器(功能(产品,产品索引){ 返回(prodIndex==productId); }); }); 控制台日志(产品); 返回false; };
感谢您的快速回复。只传递productId的问题在于,由于名称、描述和定价不同,数据需要像进入菜单时一样存储在购物车中。如果我也能将这些传递给函数,它就会得到解决,定价似乎不成问题,但名称也给了我“未定义”。有什么想法吗?那么您是否正在执行另一个ajax调用以获取更新的数据?这是在哪里发生的?如果是,您不能用更新的数据更新全局
store
对象吗?产品id不会更改,是吗?“购物车”将在购物车“签出”后发布到API,这将在稍后发生。数据不应更新,并且仍然必须按“订单”中的原样显示,无论价格或名称发生什么变化,只有ID将作为产品的参考。我尝试过这样做:addToCart(“+productId+”,“+product.name+”);但是当我使用console.log时,它只会给我一个错误:“testproduct未定义”:我太愚蠢了,我不得不更改:addToCart(“+productId+”,“+product.name+”);添加到目录(“+productId+”,\“+product.name+”\);当然……:)