push only unique elements in an array

后端 未结 6 1423
-上瘾入骨i
-上瘾入骨i 2021-01-19 14:25

I have array object(x) that stores json (key,value) objects. I need to make sure that x only takes json object with unique key. Below, example \'id\' is the key, so i don\'t

6条回答
  •  梦谈多话
    2021-01-19 15:01

    JS objects are great tools to use for tracking unique items. If you start with an empty object, you can incrementally add keys/values. If the object already has a key for a given item, you can set it to some known value that is use used to indicate a non-unique item.

    You could then loop over the object and push the unique items to an array.

    var itemsObj = {};
    var itemsList = [];
    x = [{"id":"item1","val":"foo"},
        {"id":"item2","val":"bar"},
        {"id":"item1","val":"baz"},
        {"id":"item1","val":"bez"}];
    
    for (var i = 0; i < x.length; i++) {
        var item = x[i];
        if (itemsObj[item.id]) {
            itemsObj[item.id] = "dupe";
        }
        else {
            itemsObj[item.id] = item;
        }
    }
    
    for (var myKey in itemsObj) {
        if (itemsObj[myKey] !== "dupe") {
            itemsList.push(itemsObj[myKey]);
        }
    }
    
    console.log(itemsList);
    

    See a working example here: https://jsbin.com/qucuso

    If you want a list of items that contain only the first instance of an id, you can do this:

    var itemsObj = {};
    var itemsList = [];
    x = [{"id":"item1","val":"foo"},
        {"id":"item2","val":"bar"},
        {"id":"item1","val":"baz"},
        {"id":"item1","val":"bez"}];
    
    for (var i = 0; i < x.length; i++) {
        var item = x[i];
        if (!itemsObj[item.id]) {
            itemsObj[item.id] = item;
            itemsList.push(item);
        }
    }
    
    console.log(itemsList);
    

提交回复
热议问题