簡體   English   中英

檢查數組是否包含沒有引用的對象

[英]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.keysArray.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM