特定の基準が満たされた場合にオブジェクトを配列に追加する次のループがあります。
var form = $('form[id^="product-form"]'),
submit_button = $('#add-to-cart'),
attr_fields = $('.additional input[type=text]'),
attr_fields_default = {};
// Get the default values for each attribute field and place into an obj
attr_fields.each(function () {
var field = $(this),
field_id = field.attr('id'),
field_val = field.val();
attr_fields_default[field_id] = field_val;
});
var extra_attr = [];
for (var i = 0; i < attr_fields.length; i++) {
var _field = $(attr_fields[i]);
if (_field.val() != attr_fields_default[_field.attr('id')]) {
var jsonStr = {
'add': _field.attr('id'),
'quantity': 1
};
extra_attr.push(jsonStr);
console.log(jsonStr);
} else {
_field.attr('disabled', 'disabled').val('None');
}
}
console.log(extra_attr);
コードは最後のループまで完全に機能しますが、console.log(jsonStr)は期待どおりに最後のオブジェクトを出力しますが、console.log(extra_attr)は出力しません。最後の項目を配列にプッシュしません。jsonStrをダミーの文字列'test'に変更しようとしても、同じ結果が得られます。
これが私のChromeデベロッパーコンソールのスクリーンショットですhttp://cl.ly/GdHw
また、元々.each()を使用してセレクターをループしようとしたところ、まったく同じ結果が得られたことにも注意してください。
attr_fields
.each(function(){
if ( $(this).val() != attr_fields_default[ $(this).attr('id') ] ) {
var jsonStr = {'add': $(this).attr('id'), 'quantity': 1};
extra_attr.push( jsonStr );
console.log( jsonStr );
} else {
$(this).attr('disabled', 'disabled').val('None');
}