【问题标题】:Get name-value pair from object?从对象获取名称-值对?
【发布时间】:2016-03-26 23:20:41
【问题描述】:

我有一个对象

  var foodLoads = {
    orange: 6.7,
    apple: 5.6,
    banana: 12.7,
    grapes: 16.3,
    peach: 2.7,
    pear: 6.5,
    mango: 16.1,
    blueberries: 9.3,
    grapefruit: 1.7,
    strawberries: 3.5,
    tangerine: 3.1,
    watermelon: 8,
    duck: 0,
    beef: 0,
    chicken: 0,
    ham: 0,
    turkey: 0,
    elk: 0,
    pork: 0,
    fish: 0,
    eggs: 0,
    lamb: 0,
    applejuice: 11.8,
    cranberryjuice: 23.3,
    orangejuice: 14.4,
    carrotjuice: 8.6,
    lemonade: 24.3,
    hotchocolatemix: 10.2,
    tomatojuice: 3.5,
    chocolatemilk: 13.3,
    almondmilk: 0.02,
    soymilk: 4,
    wholewheatbread: 6.1,
    whitebread: 10.7,
    bagel: 30,
    waffle: 13.8,
    pancake: 5.3,
    croissant: 12.2,
    muffin: 28.8,
    englishmuffin: 21.3,
    doughnut: 15.2,
    oatmeal: 12.6,
    quinoa: 20.4,
    wholegrainbread: 7.1 
  }

$('.submit-items').on('click', function() {
    var type = $('.food-list .active li');
    var foodName = $(type).text();
    var value = foodLoads[foodName];
    $(type).parent().append('<p>' + value + '</p>');  

})

在上面的点击功能中,我实际上想要做的是:

  1. 获取名称与“foodName”变量中的文本匹配的属性(来自 foodLoads 对象)
  2. 将该属性的 VALUE 放在一个段落中
  3. 将该段落附加到“type”变量的父级中。

下面是对应的 HTML:

<ul class="food-list">
   <div class="active orange">
      <li> orange</li>
      <select class="serving-size"><option value="1">1</option>
         <option value="2">2</option>
         <option value="3">3</option>
         <option value="4">4</option>
      </select>
   </div>
</ul>

<ul class="food-list">
   <div class="active eggs">
      <li> orange</li>
      <select class="serving-size"><option value="1">1</option>
         <option value="2">2</option>
         <option value="3">3</option>
         <option value="4">4</option>
      </select>
   </div>
</ul>

<ul class="food-list">
   <div class="active bagel">
      <li> orange</li>
      <select class="serving-size"><option value="1">1</option>
         <option value="2">2</option>
         <option value="3">3</option>
         <option value="4">4</option>
      </select>
   </div>
</ul>

*&lt;ul&gt; 中的 div 是在用户选中复选框时动态创建的。

 $('input').on('ifChecked', function(event) {       
    var liText = $(this).parent().parent().text();
    var wrappedUp = $('<div class="active"><li>' + liText + '</li><select class="serving-size"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option></select></div>');
    $('.food-list').append(wrappedUp);
    $(wrappedUp).addClass('' + liText + '');

*从我所做的测试中,我看到除了“值”变量之外一切正常。

这让我问这个问题:

该(“值”变量)是检索对象(foodLoads)中属性值的正确语法吗?

非常感谢您的帮助:)

【问题讨论】:

  • 您要求值的方式是正确的。检查您要求的食物名称。我的猜测,您的选择器(类型)可能不正确。顺便说一句,由于type是一个jQuery对象,你不需要将它包装到另一个选择器方法中,你可以直接使用type.text()。
  • 如果您的value 变量不能正常工作,那么可能是因为您的foodName 变量不正确,这可能是因为它之前的jQuery 不正确。我们需要查看这段 Javascript 代码附带的 HTML,才能知道问题出在哪里。
  • 您的 jQuery 似乎应该是 var type = $('.food-list li.active');,但我们需要查看您的 HTML 才能确定。
  • 这里有一些 HTML 可以使用稍微固定的代码版本:jsfiddle.net/jfriend00/2efhcgxp。这表明,如果您有正确的 HTML 代码,则在表格中查找文本的概念是有效的。
  • 呃,你不能将&lt;li&gt; 包裹在&lt;div&gt; 中。那不是合法的 HTML。 &lt;li&gt; 父级应该是 &lt;ul&gt;&lt;ol&gt;&lt;menu&gt;。来自MDNHTML
  • 元素(或 HTML 列表项元素)用于表示列表中的一项。它必须包含在父元素中:有序列表 (
      )、无序列表 (
      ) 或菜单 (
    )
  • 。你为什么不向我们展示实际的 HTML,我们可以停止猜测它的样子!

标签: jquery object dom syntax


【解决方案1】:

现在您已经包含了 HTML,这里有几个问题。

&lt;li&gt; 的直接父级必须是 &lt;ol&gt;&lt;ul&gt;&lt;menu&gt; 标记。所以你的 HTML 是不合法的。见reference on MDN

HTML &lt;li&gt; 元素(或 HTML 列表项元素)用于表示 列表中的一项。它必须包含在父元素中: 有序列表 (&lt;ol&gt;)、无序列表 (&lt;ul&gt;) 或菜单 (&lt;menu&gt;)

然后,一旦你修复了这个问题和 jQuery 中的相应选择器,你的表格查找可能无法正常工作,因为你的 HTML 中有一个前导空格

<li> orange</li>

这将在您的 foodName 变量上放置一个前导空格,这将导致它在对象查找中找不到任何内容。

修复 HTML 和相应的 jQuery 选择器以生成合法的 HTML 后,您可以删除 &lt;li&gt; 标记内的前导空格,也可以使用以下命令修剪任何前导尾随空格:

var foodName = $(type).text().trim();

您还必须确保与.active 匹配的&lt;li&gt; 不超过一个,因为如果您这样做了,那么.text() 将从它们两者中获取文本并将其连接起来,这将也不匹配对象中的任何键。

【讨论】:

  • 我刚刚添加了用于创建动态 div 的 js 代码:是否有任何理由应该在
  • 中使用我所拥有的任何前导空格?
  • @Edson - 这完全取决于$(this).parent().parent().text() 中的文本来源&lt;li&gt; 中是否有空格。你没有告诉我们,所以我们真的不知道。在进行查找之前,您可能更安全地使用.trim(),以防万一。
  • 好的,谢谢,我会继续进行编辑并更新发生的情况。非常感谢您的帮助!
  • 它与 .trim() 一起工作!虽然,我将进行更改以拥有合法的 html,因为我不想要任何糟糕的 html。
  • @Edson - 当您有多个活动时,您希望行为是什么?如果要单独处理每个匹配项,则必须在匹配的 &lt;li&gt; 标记列表中处理使用 .each() 并在 .each() 循环内分别处理每个标记。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签