2014-09-26 71 views
0

我想建立一个json对象在比较的javascript/jquery中。下面是我有寻找文本来比较真或假

HTML:

<div class="field"> 
    <div>size</div> 
    <div>large</div> 
    <div>medium</div> 
    <div>number</div> 
</div> 

JS:

selectedObj = { 
    'fieldSize':false, 
    'sizeXSmall':false, 
    'sizeSmall':false, 
    'sizeMedium':false, 
    'sizeLarge':false, 
    'sizeXLarge':false, 
    'fieldName':false, 
    'fieldNum':false 
}; 

if(jQuery('.field div:contains("size")')){selectedObj['fieldSize'] = true} 
if(jQuery('.field div:contains("xs")')){selectedObj['sizeXSmall'] = true} 
if(jQuery('.field div:contains("small")')){selectedObj['sizeSmall'] = true} 
if(jQuery('.field div:contains("medium")')){selectedObj['sizeMedium'] = true} 
if(jQuery('.field div:contains("large")')){selectedObj['sizeLarge'] = true} 
if(jQuery('.field div:contains("xl")')){selectedObj['sizeXLarge'] = true} 
if(jQuery('.field div:contains("name")')){selectedObj['fieldName'] = true} 
if(jQuery('.field div:contains("number")')){selectedObj['fieldNum'] = true} 

所以最好我最终会得到一个对象,它看起来像这样:

selectedObj = { 
    'fieldSize':true, 
    'sizeXSmall':false, 
    'sizeSmall':false, 
    'sizeMedium':true, 
    'sizeLarge':true, 
    'sizeXLarge':false, 
    'fieldName':false, 
    'fieldNum':true 
}; 

我,而不是结束与一切事物都是真实的物体相对立。这里有一个例子:

http://jsfiddle.net/vz600nd7/ 

此外,当我安慰的前记录它,它看起来像这样经过:

preview mismatch

它看起来像“预览”时给予正确的信息,但实际观点不是。

+1

'的jQuery(”字段的div:包含( “大小”) ')'返回一个总是为真的jQuery对象,所以''jQuery('。field div:contains(“size”)'')' – 2014-09-26 06:15:42

+0

当记录对象时不要相信'console.log'。它倾向于提供对象的实时视图,因此即使在* console.log运行后属性被更新了,控制台仍然显示更新的值。 – 2014-09-26 06:16:12

回答

2

正如我在评论中所说,jQuery(selector)将返回一个jQuery对象,它总是一个真值。所以你的if条件每次都会被执行。

我会尝试像

var log = (function() { 
 
    var $log = $('#log'); 
 
    return function(msg) { 
 
    $('<p/>', { 
 
     text: msg 
 
    }).appendTo($log) 
 
    } 
 
})(); 
 

 
var map = { 
 
    'fieldSize': 'size', 
 
    'sizeXSmall': 'xs', 
 
    'sizeSmall': 'small', 
 
    'sizeMedium': 'medium', 
 
    'sizeLarge': 'large', 
 
    'sizeXLarge': 'xl', 
 
    'fieldName': 'name', 
 
    'fieldNum': 'number' 
 
}; 
 
selectedObj = { 
 
    'fieldSize': false, 
 
    'sizeXSmall': false, 
 
    'sizeSmall': false, 
 
    'sizeMedium': false, 
 
    'sizeLarge': false, 
 
    'sizeXLarge': false, 
 
    'fieldName': false, 
 
    'fieldNum': false 
 
}; 
 

 
var $els = jQuery('.field div'); 
 
$.each(map, function(key, value) { 
 
    selectedObj[key] = $els.is(':contains("' + value + '")') 
 
}); 
 
log('After: ' + JSON.stringify(selectedObj))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="field"> 
 
    <div>size</div> 
 
    <div>large</div> 
 
    <div>medium</div> 
 
    <div>number</div> 
 
</div> 
 
<div id="log"></div>
如果要检测

+0

'var map = {...};'确实使代码更好。 – Regent 2014-09-26 06:25:52

+0

这工作,谢谢! – 2014-09-26 06:28:14

0

,如果对象存在,使用:

if($('.field div:contains("size")')[0]) selectedObj['fieldSize'] = true; 
...