[英]Check if array contains object without reference
我有以下功能:
function containsObject(object, array) {
for (var i = 0; i < array.length; i++) {
if (array[i] === object) {
return i;
}
}
return false;
}
以下數組:
var array = [
{
name: 'test1',
age: 12
},
{
name: 'test2',
age: 14
}
];
我需要檢查以下對象是否在數組中:
var object = {
name: 'test1',
age: 12
};
但是當我使用該函數檢查數組是否包含對象時:
console.log(containsObject(object, array));
它將返回false
,因為對象的引用不相同。 從技術上講,對象並不相同。
如何在不共享引用的情況下繼續這樣做?
小提琴: https : //jsfiddle.net/thatOneGuy/3ys6s7sy/2/
您必須使用另一個對象的每個元素檢查對象的每個元素。
function containsObject(object, array) {
for (var i = 0; i < array.length; i++) {
var count = 0;
var matching = true;
for (var key in object) {
if (array[i][key] === object[key]) {
matching = true;
if (count == Object.keys(array[i]).length - 1 && matching) {
return i;
} else {
count++;
}
} else {
matching = false;
}
}
}
return false;
}
var array = [{
name: 'test2',
age: 14
}, {
name: 'test1',
age: 12
}];
var thisObject = {
name: 'test1',
age: 12
};
console.log(containsObject(thisObject, array));
我改變了數據,看它是否有效。 它現在正確記錄'我'。 如果您要比較大量數據,這將非常慢。 你總是可以對兩個對象進行字符串化並比較兩個字符串嗎?
這是這個功能:
function containsObject(object, array) {
for (var i = 0; i < array.length; i++) {
for (var key in object) {
//if (array[i][key] === object[key]) {
// return i;
//}
if (JSON.stringify(array[i]) === JSON.stringify(object)) {
return i;
}
}
}
return false;
}
正如評論中所提到的,第一個不適合深入比較。 而stringify會。 我會小心對象的順序不同。 例如,如果您使用此對象:
var thisObject = {
age: 12,
name: 'test1'
};
為了比較,它不會像它只是一個直接的字符串比較。
使用stringify: https : //jsfiddle.net/thatOneGuy/3ys6s7sy/1/
我最終使用了theOneGuy的解決方案,改變它以便它可以搜索數組和對象:
function containsObject(needle, haystack) {
for (var i in haystack) {
var count = 0,
matching = true;
for (var key in needle) {
if (haystack[i][key] === needle[key]) {
matching = true;
if (count == Object.keys(haystack[i]).length - 1 && matching) {
return i;
} else {
count++;
}
} else {
matching = false;
}
}
}
return false;
}
最好通過Array.prototype.contains()
的發明來完成。 所以讓我們發明它。 但是,我將使用我以前的發明Object.prototype.compare()
和Array.prototype.compare()
Object.prototype.compare = function(o){ var ok = Object.keys(this); return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false; }; Array.prototype.compare = function(a){ return this.every((e,i) => typeof a[i] === "object" ? a[i].compare(e) : a[i] === e); }; Array.prototype.contains = function(o){ return this.some(e => typeof o === "object" ? o.compare(e) : o === e); } var arr = [ { name: 'test1', age: 12 }, { name: 'test2', age: 14 } ], obj1 = { name: 'test1', age: 12 }, obj2 = { name: 'test1', age: 11 }, arr2 = [1,2,3]; document.writeln(arr.contains(obj1)); document.writeln(arr.contains(obj2)); document.writeln(arr2.contains(3)); document.writeln(arr2.contains(4));
那么你當然可以修改它以獲得索引或找到的匹配的參考。
使用Object.keys
和Array.sort
函數的解決方案。
我已經擴展了你的初始數組,以獲得一個更復雜的例子:
function containsObject(object, array) {
var props = Object.keys(object),
len = array.length,
props_count = props.length, inner_obj, inner_props, inArray = false;
props.sort();
while (len--) {
inner_obj = array[len];
inner_props = Object.keys(inner_obj);
inner_props.sort();
if (props_count === inner_props.length) {
while (props_count--) {
if (object[props[props_count]] !== inner_obj[inner_props[props_count]]) {
break;
}
inArray = true;
}
if (inArray) return len; // return array key which has an equal object
props_count = props.length;
}
}
return false;
}
var array = [{ name: 'test3', age: 12 }, { name: 'test2', age: 14 }, { name: 'test1', age: 12 }],
object = { name: 'test1', age: 12 };
console.log(containsObject(object, array)); // 2 - appropriate key
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.