如何仅当对象不存在时才使用javascript添加对象

How to add object only if it does not exist in list using javascript?

本文关键字:对象 javascript 添加 何仅当 不存在      更新时间:2023-09-26

我有一个空数组:"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)}

虽然我发现这不适用于对象。

JSON.stringify(obj1) === JSON.stringify(obj2);

您可以将对象与上面的代码进行比较,但这有一些技巧。如果两个对象都像 {x: 100, y: 1}{x: 100, y: 1}则结果为 true,但如果{x: 100, y: 1}{y: 1, x: 100} 则显示 false。

您可以使用比较器

    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);

您还可以使用下划线.js的实用程序函数进行比较:isEqual

我会使用这样的东西,它循环遍历数组并根据您的参数检查每个项目。每次不匹配时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)
    }
};

您应该通过循环testList中的所有元素来比较对象相等性。 如果你使用UnderscoreJS,这很容易。

function addIfNotInList(obj, list) {
    var doesNotExist = _.every(list, function(item) {
        return !_.isEqual(item, obj);
    });
    if (doesNotExist) {
        list.push(obj);
    }
}