陣列不重複 如何檢查數組中除了0的JavaScript重複




陣列不重複 (5)

如果你的數據只是對象,你可以寫一個函數來檢查兩個對像是否相等。

Object.prototype.equals = function(x)
{
    for(p in this)
    {
        switch(typeof(this[p]))
        {
            case 'object':
                if (!this[p].equals(x[p])) { return false }; break;
            case 'function':
                if (typeof(x[p])=='undefined' || (p != 'equals' && this[p].toString() != x[p].toString())) { return false; }; break;
            default:
                if (this[p] != x[p]) { return false; }
        }
    }

    for(p in x)
    {
        if(typeof(this[p])=='undefined') {return false;}
    }

    return true;
}

然後用於循環。

    function isDuplicatedata( data ) {
    for( var i = 0; i < data.length - 1; i ++ ) {
        for( var j = i + 1; j < data.length; j ++ ) {
            if( data[i].equals(data[j])) {
                return true;
            }
        }
    }

    return false;
}

用這種方法你可以檢查任何種類的數據。 請注意,這種方法的複雜性是O(n ^ 2)。

我有一個變量data對像數組。 現在我想檢查是否有除了0之外的重複值。到目前為止我所做的是下面的代碼片段:

警報顯示我是真的應該是錯誤的原因0不包括檢查。 請幫忙。 謝謝

var data = [{id: 0},  {id: 1}, {id: 3}, {id: 0},];
            
            
var checkdata= data.map(function(item){ 
return item.id });
var isDuplicatedata= checkdata.some(function(item, idx){ 
    return checkdata.indexOf(item) != idx 
});
            
alert(isDuplicatedata)
 


我建議排序數組,並檢查當前的id是否與以前的ID相同。 該方法只遍歷數組2次

var data = [{id: 0},  {id: 1}, {id: 3}, {id: 0}];
//Sort the array so it becomes [0,0,1,3]
data.sort(function(a, b) {
  if (a.id < b.id)
    return -1;
  else if (a.id > b.id)
    return 1;
  else
    return 0;
});
//Now check all the objects and compare them with the previous array element
var isDuplicatedata = false;
for (var i = 1, l = data.length; i < l; i++) {
  var rec = data[i],
    previousRec = data[i - 1];
  //Skip zeroes
  if (rec.id !== 0 && rec.id === previousRec.id) {
    isDuplicatedata = true;
    break;
  }
}

alert(isDuplicatedata);


你可以使用Array.prototype.some()

some()方法測試數組中的某個元素是否通過了由提供的函數實現的測試。

和一個臨時對象。

var data = [{ id: 0 }, { id: 1 }, { id: 3 }, { id: 0 } ],
    object = {},
    duplicate = data.some(function (a) {
        if (a.id === 0) {
            return false;
        }
        if (a.id in object) {
            return true;
        }
        object[a.id] = true;
    });

document.write(duplicate);


當你使用lodash你可以這樣做:

var data = [{id: 0},  {id: 1}, {id: 3}, {id: 0}];

// group by id
var result = _.groupBy(data, function (item) {
     return item.id;
});

// remove the 0
delete result[0]

// check if there are duplicates
var isDuplicatedData = _.some(Object.keys(result), function (k) {
     return result[k].length > 1;
});

如果你沒有lodash,這裡是在純javascript中使用的功能:

var groupBy = function(arr, grouper) {
    var map = {};
    (arr || []).forEach(function(element) {
        var key = grouper(element);
        map[key] = map[key] || [];
        map[key].push(element);
    });
    return map;
 };
var some = function (arr, predicate) {
    return (arr || []).reduce(function (a, b) {
        return a || predicate(b);
    }, false);
};

這裡是lodash的一個lodash -one: httpslodash


對像不能與其他原始類型比較。

我寫了一個函數來解決你所問的問題,它與你實現的完全不同, 在性能和實用性方面可能不是很好

var data = [{id: 0},  {id: 1}, {id: 2}, {id: 0},{id: 3}];

function isDuplicatedata() {            
  for(var i = 0; i < data.length; i++) {
    if(data[i].id === 0)
      continue;
    for(var j = i+1; j < data.length; j++) {
      if(data[j].id === data[i].id)
        return true;
    }
  }
  return false;
}

alert(isDuplicatedata())




duplicates