2014-09-26 4 views
0

Я пытаюсь построить json-объект в javascript/jquery, который сравнивается. Вот что у меня естьПоиск текста для сравнения true или false

HTML:

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

ЯШ:

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 (» поле ДИВ:. Содержит ("размер") ') 'возвращает объект jQuery, который всегда истинен, поэтому' jQuery ('. field div: contains ("size") '). length' –

+0

Не доверяйте 'console.log' при регистрации объектов. Он имеет тенденцию обеспечивать живое представление объекта, поэтому даже если свойства обновляются * после того, как вы запускаете свой 'console.log', консоль все еще показывает обновленные значения. –

ответ

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

+0

Это сработало, спасибо! –

0

, если вы хотите, чтобы обнаружить, если объект существует, использование:

if($('.field div:contains("size")')[0]) selectedObj['fieldSize'] = true; 
... 
Смежные вопросы