我有一个难以想象的巨大订单,我正在梳理价值并从中构建数组。除此之外,我还需要一些each()
次迭代来提取值,然后将它们附加到之后使用的变量中。问题是值是返回undefined,我认为这是因为它们是在循环中分配的。
这是我的逻辑:
我的理解是函数外部的变量声明允许我全局使用它。猜猜我错了!
这是一个jsFiddle:http://jsfiddle.net/x7CL6/
以下是代码:
$('a').click(function(event){
event.preventDefault();
/* Declare Variables */
var test = [],
one,
two,
three,
four,
el,
kind,
val;
/* Loop through each paragraph */
$('section').find('p').each(function(){
el = $(this);
kind = el.attr('class');
val = el.html();
if (val === '1'){
one = val;
} else if (val === '2'){
two = val;
} else if (val === '3'){
three = val;
} else if (val === '4'){
four = val;
}
});
test.push({
one: one,
two: two,
three: three,
four: four
});
console.log(test);
});
答案 0 :(得分:0)
“我的理解是函数外部的变量声明允许我全局使用它。”
如果变量的声明在任何函数之外,则该变量是全局变量。在您的情况下,所有变量都在点击处理函数中定义,因此所有变量都可以在其中访问,任何嵌套函数都包括each()
回调。
如果意图是每次点击都应该向test
数组添加另一个对象,那么您需要在点击处理程序之外定义test
。
您的变量未定义的原因是因为您的if / else条件始终为false,因此永远不会为变量赋值。您的val
变量会从循环的当前元素中分配html内容,并且html内容永远不会等于"1"
,"2"
等字符串,您将其与
我认为您可能希望将每个元素的类属性进行比较,而不是将其放在kind
变量中:
if (kind === "1")
依此类推:http://jsfiddle.net/x7CL6/4/
...但鉴于您似乎正按文档顺序处理元素,您可以利用jQuery将.each()
回调传递给当前元素的索引这一事实:
$('section').find('p').each(function(i){ // add i param
// inside the loop test i (note it starts with 0)
// instead of testing val or kind
演示:http://jsfiddle.net/x7CL6/2/
然而,仍然会留下一个丑陋的if / else if / ...结构,你可以避免这样:
var test = [],
propNames = ["one","two","three","four"],
obj = {};
$('section').find('p').each(function(i){
obj[ propNames[i] ] = $(this).html();
});
test.push(obj);