我有一个空数组:“testList = []” 我想要一个仅在对象存在的情况下添加对象的函数:
addIfNotInList({'keya':'a','keyb':'b'}, testList);
addIfNotInList({'keya1':'a5','keyb':'b2'}, testList);
addIfNotInList({'keya':'a','keyb':'b'}, testList);
结果应该是:
testList = [{'keya':'a','keyb':'b'},{'keya1':'a5','keyb':'b2'}]
通常如果它不是一个对象,我会这样做:if(testList.indexOf(stringvalue)) {testList.push(stringvalue)}
虽然我发现这不适用于对象。
答案 0 :(得分:1)
您可以使用比较器
var testList = [];
var myComparator = function (obj1, obj2) {
// check if they are the same
return obj1.keya === obj2.keya && obj1.keyb === obj2.keyb;
};
var addIfNotInList = function(obj, list, comparator) {
// you can also declare the comparing function here as default
comparator = comparator || myComparator;
// check if already in the list
var exists = list.some(function(listItem) {
return comparator(obj, listItem);
});
if(!exists) {
list.push(obj);
}
};
addIfNotInList({'keya':'a','keyb':'b'}, testList);
addIfNotInList({'keya':'a5','keyb':'b2'}, testList);
addIfNotInList({'keya':'a','keyb':'b'}, testList);
console.log(testList);
您还可以使用underscore.js的效用函数进行比较:isEqual
答案 1 :(得分:1)
execute()
您可以将对象与上面的代码进行比较,但这里有一些小技巧。如果两个对象都像JSON.stringify(obj1) === JSON.stringify(obj2);
和{x: 100, y: 1}
,则结果为true,但如果{{1}则显示为false }和{x: 100, y: 1}
。
答案 2 :(得分:0)
我会使用类似这样的东西,它循环遍历数组并根据你的参数检查每个项目。每次它与counter
不匹配时,如果counter
与数组末尾的长度一样大,那么该对象必须不匹配那里已有的任何对象。希望这有帮助!
var addIfNotInList = function(object, testList){
var counter = 0;
for(var i = 0; i < testList.length, i++){
if(testList[i]) !== object){
counter++;
}
}
if(counter === testList.length){
testList.push(object)
}
};
答案 3 :(得分:0)
您应该通过循环testList
中的所有元素来比较对象相等性。如果您使用underscorejs,则非常简单。
function addIfNotInList(obj, list) {
var doesNotExist = _.every(list, function(item) {
return !_.isEqual(item, obj);
});
if (doesNotExist) {
list.push(obj);
}
}