2016-04-21 118 views
0

我有一個包含用戶帳戶和複選框的頁面。保存時,我需要將複選框的所有值添加到對象中,只要它們不存在於其中即可。jQuery檢查值是否在對象中

當我使用關聯數組時,我有這個工作,因爲我當時只存儲了一個值。我現在將它作爲一個對象存儲,並且我需要確保該對象中不存在QID(這是唯一的)。

有沒有一種優雅的方法來解決這個問題?

var selectedUsers = []; 

$(tab).find(".cb:checked").each(function() { 
     // If the QID is not already in the array, add it 
     if(jQuery.inArray($(this).val(), selectedUsers) === -1) { 
      selectedUsers.push({ 
       "qid": $(this).val(), 
       "first": $(this).data('emp_first'), 
       "last": $(this).data('emp_last'), 
       "department": $(this).data('emp_dept') 
      }); 
     } 
    }); 
+0

也許你不需要if條件 –

+0

JS實際上並沒有關聯數組......如果你有字符串鍵,那麼你需要一個常規的對象,而不是一個數組。我建議爲選定的用戶創建一個對象而不是數組,然後你可以通過qid來索引它。 –

+1

在我看來,這裏的對象陣列還是比較好的。畢竟,這是一個用戶列表。 – azium

回答

1

數組中只要保持你加入ID對地圖,這樣很容易和有效的檢查,如果一個ID存在,不管數據結構的

var selectedUsers = []; 
var addedUsers = {}; 

$(tab).find(".cb:checked").each(function() { 

    var qid = this.value; 

    if (!(qid in addedUsers)) { 
     selectedUsers.push({ 
      qid : qid, 
      first : $(this).data('emp_first'), 
      last : $(this).data('emp_last'), 
      department : $(this).data('emp_dept') 
     }); 
     addedUsers[qid] = 'x'; 
    } 
}); 
0

可以使用這裏有各種各樣的東西,但也許some是你想要的。

if (!selectedUsers.some(function (user) { 
    return user.qid === $(this).val() 
})) { 
    selectedUsers.push(...) 
} 

這就是說,如果數組中沒有任何項目的qid匹配,推送一個新的。

更多文筆優美:

var qid = $(this).val() 
if (!selectedUsers.some(user => user.qid === qid) { 
    selectedUsers.push(..) 
} 
1

創建一個通用的查找功能,然後使用它:

function lookup(myArray, searchTerm, property, firstOnly) { 
    var found = []; 
    for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i][property] === searchTerm) { 
     found.push(myArray[i]); 
     if (firstOnly) break; //if only the first 
     } 
    } 
    return found; 
    } 

使用它:

var existUser = lookup(selectedUsers,"qid",$(this).val(),true); 
if(existUser && existUser.length){// it returned a match if len > 0 
    push it here 
} 

這是一個有點冒險,如果有人已經查閱了,所以讓我們命名空間我噸,其他一些:)(更改myApp到你)

使用:

var existUser = myApp.arrayObj.lookup(selectedUsers,"qid",$(this).val(),true); 

或使用包含:

var hasUser = myApp.arrayObj.contains(selectedUsers,"qid",$(this).val()); 

功能:

var myApp = myApp || {}; 
myApp.arrayObj = { 
    indexOf: function(myArray, searchTerm, property) { 
    for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i][property] === searchTerm) return i; 
    } 
    return -1; 
    }, 
    indexAllOf: function(myArray, searchTerm, property) { 
    var ai = []; 
    for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i][property] === searchTerm) ai.push(i); 
    } 
    return ai; 
    }, 
    lookup: function(myArray, searchTerm, property, firstOnly) { 
    var found = []; 
    for (var i = 0; i < myArray.length; i++) { 
     if (myArray[i][property] === searchTerm) { 
     found.push(myArray[i]); 
     if (firstOnly) break; //if only the first 
     } 
    } 
    return found; 
    }, 
    lookupAll: function(myArray, searchTerm, property) { 
    return this.lookup(myArray, searchTerm, property, false); 
    }, 
    remove: function(myArray, searchTerm, property, firstOnly) { 
    for (var i = myArray.length - 1; i >= 0; i--) { 
     if (myArray[i][property] === searchTerm) { 
     myArray.splice(i, 1); 
     if (firstOnly) break; //if only the first term has to be removed 
     } 
    } 
    }, 
    contains: function(myArray, searchTerm, property){ 
     return this.indexOf(myArray, searchTerm, property) !== -1; 
    } 
}; 
+0

這是一個非常深思熟慮的迴應,但很多這些東西都是在原生JS中實現的。我認爲你可以完成每一個沒有一個'for'循環。 – azium

+0

向後兼容舊版瀏覽器,我測試了它們的速度,即使是針對Chrome中的某些本地內容,也發現它在很多情況下速度更快或更快。即map和.keys等。即使是本地的,也需要以某種方式循環迭代。 –

+0

例如對於1200個匹配的對象的10,000個對象lookupAll Took:0.7949999999999591msecs found:1200 –