2015-03-16 4 views
-1

У меня есть ul, содержащий li, в котором содержатся названия разных ингредиентов рецептов для страницы рецепта. Я пытаюсь получить эти ингредиенты и хранить их в массиве JavaScript внутри объекта. Я уже знаю название рецепта, поэтому я положил это прямо в свойство объекта title, но я не знаю, сколько ингредиентов будет для каждого рецепта. Вот что у меня есть:Заполнение массивов после их определения

var recipeobj = { 
     title: $('h3.title').val(), 
     ingredients: [ 
       ingredient, 
       optional 
     ] 
    } 
    $.each($('ul.ingredients > li > h4'), function (index, ingredient) { 
     recipeobj.ingredients[index].ingredient = $(ingredient).html(); 
     recipeobj.ingredients[index].optional = false; 
    }) 

Если я пытаюсь сделать console.log(recipeobj.ingredients) я просто получаю ошибку Uncaught ReferenceError: ingredient is not defined

Нет сомнений, что это просто, я просто редко нужно использовать массивы в JavaScript так мало опыта работы с ними ,

+0

Вы, кажется, возникли проблемы с массивами и объектами. Для чего «необязательно»? – blex

+0

Вы смешиваете javascript и javascript объектную нотацию. Тогда у вас есть другие проблемы с синтаксисом. – eyegropram

+0

@eyegropram без проблем с этим, javascript object notation (JSON) - это Javascript. Основная проблема заключается в том, что он использует переменные до их определения. Но, тем не менее, окончательная желаемая структура не очень ясна. Фрейт, не могли бы вы привести пример того, как должен выглядеть последний 'recipeobj'? – blex

ответ

0

Откройте консоль и запустить его

var recipeobj = { 
 
    title: $('h3.title').html(), 
 
    // ingredients is empty for now 
 
    ingredients: [] 
 
}; 
 

 
$.each($('ul.ingredients > li > h4'), function(index, ingredient) { 
 
    // Get the name 
 
    var name = $(ingredient).html(), 
 
     // Find out if it is 'optional'(using a class here) 
 
     optional = $(ingredient).hasClass('optional'); 
 
    // Push a new ingredient into the array 
 
    recipeobj.ingredients.push({ name: name, optional: optional }); 
 
}); 
 

 
console.log(recipeobj);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h3 class="title">Pork and beans</h3> 
 

 
<ul class="ingredients"> 
 
    <li> 
 
    <h4>Pork</h4> 
 
    </li> 
 
    <li> 
 
    <h4>Beans</h4> 
 
    </li> 
 
    <li> 
 
    <h4 class="optional">Salt*</h4> 
 
    </li> 
 
</ul>

Это должно выход:

{ 
    "title": "Pork and beans", 
    "ingredients": [ 
     { name : "Pork", optional : false }, 
     { name : "Beans", optional : false }, 
     { name : "Salt*", optional : true} 
    ] 
} 
+0

Спасибо blex, см. мой комментарий на ответ eyegropram, чтобы получить лучшее представление о структуре – Frayt

+0

@Frayt Обновлено.Попробуйте и откройте консоль – blex

+0

Отлично, спасибо. – Frayt

0
var rObj = { 
     title: $('h3.title').val(), 
     ingredients: [ 
       'source cream', 
       'cheese', 
       'chopped meat' 
     ], 
     optional: true 
    }; 

доступа

var rItem = rObj.ingredients[1]; 

или вы хотите

var rObj = { 
     title: $('h3.title').val(), 
     ingredients: { 
       ingredient_list: ['one','two','three'], 
       optional: true 
     } 
    }; 

доступом

var rItem = rObj.ingredients.ingredient_list[1]; 

Структура вы пытаетесь использовать как выглядит структура должна быть как

var rObj = { 
      title: $('h3.title').val(), 
      things: [{ 
       ingredient: 'source cream', 
       optional: true 
      }, 
      { 
       ingredient: 'cheese', 
       optional: false 
      }] 
     }; 

доступа

var ingred = rObj.things[1].ingredient; 
+0

Третий пример - это именно то, что я пытаюсь получить: массив объектов ингредиентов. Я думаю, что рабочий результат будет выглядеть как «ингредиенты: [{ингредиент:« исходный крем », необязательный: false}, {component: 'cheese', optional: false}] – Frayt

+0

Да, действительно, это больше похоже на то, что кажется ожидая – eyegropram

0
var rObj = { 
     title: $('h3.title').val(), 
     ingredients : [] 
    }; 

вы можете добавить ингредиенты:

 $.each($('ul.ingredients > li > h4'), function (index, ingredient) { 
    rObj.ingredients.push({ingredient: $(ingredient).html(), optional  :false}) 
})