使用把手迭代 javascript 对象

2024-04-19前端开发问题
3

本文介绍了使用把手迭代 javascript 对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在尝试使用 Handlebars 注册帮助程序以允许迭代 JSON 对象.这个要点 看起来是一个合适的解决方案.我将其转换为以下 CoffeeScript.当我使用任何一个帮助程序时,似乎什么都没有发生(对于 vanilla JavaScript 和 CoffeeScript 版本都是如此).有什么想法吗?

I am trying to register helpers with Handlebars to allow iterating over JSON objects. This gist looked like an appropriate solution. I converted that into the following CoffeeScript. Nothing seems to happen when I use either of the helpers (that holds true for both vanilla JavaScript and the CoffeeScript version). Any ideas?

$ ->
  Handlebars.registerHelper "key_value", (obj, fn)->
    buffer = ""
    key 
    for key in obj 
      if obj.hasOwnProperty(key)
        buffer += fn({key: key, value: obj[key]})
    buffer

  Handlebars.registerHelper "each_with_key", (obj, fn)->
    context
    buffer = ""
    key 
    keyName = fn.hash.key
    for key in obj 
      if obj.hasOwnProperty(key)
        context = obj[key]
        if keyName
          context[keyName] = key 
          buffer += fn(context)
    buffer

在模板中:

{{#key_value categories}}
I'M ALIVE!!
{{/key_value}}

{{#each_with_key categories key="category_id"}}
I'M ALIVE!!
{{/each_with_key}}

我目前在 Gemfile 中使用 gem 'handlebars-assets' 将把手添加到 Rails 应用程序.

I am currently using gem 'handlebars-assets' in the Gemfile to add handlebars to a rails app.

推荐答案

你的 JavaScript 到 CoffeeScript 的音译坏了.你不使用 for ... in 来迭代 CoffeeScript 中的对象,你使用 for k,v of ...:

Your JavaScript to CoffeeScript transliteration is broken. You don't use for ... in to iterate over an object in CoffeeScript, you use for k, v of ...:

使用 of 表示理解对象的属性而不是数组中的值.

Use of to signal comprehension over the properties of an object instead of the values in an array.

这个 CoffeeScript 循环:

This CoffeeScript loop:

for x in y
    ...

变成这个 JavaScript:

becomes this JavaScript:

for (_i = 0, _len = y.length; _i < _len; _i++) {
  x = a[_i];
  ...
}

所以如果 y 是一个没有 length 属性的对象,那么 _len 将是 undefined 并且 JavaScriptfor(;;) 循环根本不会迭代.

So if y is an object without a length property, then _len will be undefined and the JavaScript for(;;) loop won't iterate at all.

您还应该使用 own 而不是 hasOwnProperty:

You should also be using own instead of hasOwnProperty:

如果您只想迭代对象本身上定义的键,通过添加 hasOwnProperty 检查以避免可能从原型中插入的属性,请使用 for own对象的键、值.

If you would like to iterate over just the keys that are defined on the object itself, by adding a hasOwnProperty check to avoid properties that may be interited from the prototype, use for own key, value of object.

但这更多是为了方便而不是正确.

but that's more for convenience than correctness.

此外,CoffeeScript 循环是表达式,因此您通常会说 array = expr for own k, v in o 或等效形式:

Also, CoffeeScript loops are expressions so you'd usually say array = expr for own k, v in o or the equivalent form:

array = for own k, v in o
    expr

如果 expr 超过一行或太长而无法理解.

if expr is more than one line or too long to allow for a readable comprehension.

CoffeeScript 中帮助程序的正确且更惯用的版本看起来更像这样:

A correct and more idiomatic version of your helpers in CoffeeScript would look more like this:

Handlebars.registerHelper "key_value", (obj, fn)->
    (fn(key: key, value: value) for own key, value of obj).join('')

Handlebars.registerHelper "each_with_key", (obj, fn)->
    key_name = fn.hash.key
    buffer   = for own key, value of obj
        value[key_name] = key
        fn(value)
    buffer.join('')

演示:http://jsfiddle.net/ambiguous/LWTPv/

这篇关于使用把手迭代 javascript 对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

js删除数组中指定元素的5种方法
在JavaScript中,我们有多种方法可以删除数组中的指定元素。以下给出了5种常见的方法并提供了相应的代码示例: 1.使用splice()方法: let array = [0, 1, 2, 3, 4, 5];let index = array.indexOf(2);if (index -1) { array.splice(index, 1);}// array = [0,...
2024-11-22 前端开发问题
182

JavaScript小数运算出现多位的解决办法
在开发JS过程中,会经常遇到两个小数相运算的情况,但是运算结果却与预期不同,调试一下发现计算结果竟然有那么长一串尾巴。如下图所示: 产生原因: JavaScript对小数运算会先转成二进制,运算完毕再转回十进制,过程中会有丢失,不过不是所有的小数间运算会...
2024-10-18 前端开发问题
301

JavaScript(js)文件字符串中丢失"\"斜线的解决方法
问题描述: 在javascript中引用js代码,然后导致反斜杠丢失,发现字符串中的所有\信息丢失。比如在js中引用input type=text onkeyup=value=value.replace(/[^\d]/g,) ,结果导致正则表达式中的\丢失。 问题原因: 该字符串含有\,javascript对字符串进行了转...
2024-10-17 前端开发问题
437

layui中table列表 增加属性 edit="date",不生效怎么办?
如果你想在 layui 的 table 列表中增加 edit=date 属性但不生效,可能是以下问题导致的: 1. 缺少日期组件的初始化 如果想在表格中使用日期组件,需要在页面中引入 layui 的日期组件,并初始化: script type="text/javascript" src="/layui/layui.js"/scrip...
2024-06-11 前端开发问题
455

Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript
Rails/Javascript: How to inject rails variables into (very) simple javascript(Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript)...
2024-04-20 前端开发问题
5

“数组中的每个孩子都应该有一个唯一的 key prop"仅在第一次呈现页面时
quot;Each child in an array should have a unique key propquot; only on first time render of page(“数组中的每个孩子都应该有一个唯一的 key prop仅在第一次呈现页面时)...
2024-04-20 前端开发问题
5