只推送数组中的唯一元素

时间:2015-07-29 19:50:49

标签: javascript jquery arrays

我有一个存储json(key,value)对象的数组对象(x)。我需要确保x只使用带有唯一键的json对象。下面,示例' id'是关键,因此我不想将其他json对象存储为' item1'键。

x = [{"id":"item1","val":"Items"},{"id":"item1","val":"Items"},{"id":"item1","val":"Items"}]    

var clickId = // could be "item1", "item2"....
var found = $.inArray(clickId, x);  //
if(found >=0)
{
    x.splice(found,1);
}
else{
    x.push(new Item(clickId, obj)); //push json object
}

8 个答案:

答案 0 :(得分:9)

这会实现您正在寻找的东西吗? https://jsfiddle.net/gukv9arj/3/

host_list: "{% for host in play_hosts %} {{ host }}:{{ port }} {% endfor %}"

答案 1 :(得分:0)

您无法使用inArray(),因为您正在搜索object

我建议使用Array.some()重写自定义查找,如下所示。

var x = [{"id":"item1","val":"Items"},{"id":"item1","val":"Items"},{"id":"item1","val":"Items"}]    

var clickId = "item1";
var found = x.some(function(value) {
  return value.id === clickId;
});
alert(found);

答案 2 :(得分:0)

这就是我在纯JavaScript中的方式。

var x = [{"id":"item1","val":"Items"},{"id":"item1","val":"Items"},{"id":"item1","val":"Items"}];

function unique(arr, comparator) {
  var uniqueArr = [];
  for (var i in arr) {
    var found = false;
    for (var j in uniqueArr) {
      if (comparator instanceof Function) {
        if (comparator.call(null, arr[i], uniqueArr[j])) {
          found = true;
          break;
        }
      } else {
        if (arr[i] == uniqueArr[j]) {
          found = true;
          break;
        }
      }
    }
    if (!found) {
      uniqueArr.push(arr[i]);
    }
  }
  return uniqueArr;
};

u = unique(x, function(a,b){ return a.id == b.id; });
console.log(u);

y = [ 1,1,2,3,4,5,5,6,1];
console.log(unique(y));

答案 3 :(得分:0)

JS对象是用于跟踪唯一项目的绝佳工具。如果从空对象开始,则可以逐步添加键/值。如果对象已具有给定项的键,则可以将其设置为某个已知值,该值用于指示非唯一项。

然后,您可以循环对象并将唯一项目推送到数组。

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

请参阅此处的工作示例:https://jsbin.com/qucuso

如果您想要一个只包含第一个id实例的项目列表,您可以这样做:

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

答案 4 :(得分:0)

这很晚了,但是我做了如下的事情:

let MyArray = [];
MyArray._PushAndRejectDuplicate = function(el) {
    if (this.indexOf(el) == -1) this.push(el)
    else return;
} 

MyArray._PushAndRejectDuplicate(1); // [1]
MyArray._PushAndRejectDuplicate(2); // [1,2]
MyArray._PushAndRejectDuplicate(1); // [1,2]

答案 5 :(得分:0)

使用lodash创建一个易于阅读的解决方案。

x = _.unionBy(x, [new Item(clickId, obj)], 'id');

答案 6 :(得分:0)

let x = [{id:item1,data:value},{id:item2,data:value},{id:item3,data:value}]
let newEle = {id:newItem,data:value}
let prev = x.filter(ele=>{if(ele.id!=new.id)return ele);
newArr = [...prev,newEle]

答案 7 :(得分:0)

将近 6 年后,我最终回答了这个问题,但我需要用对象填充更复杂的数组。所以我需要添加这样的东西。

var values = [
  {value: "value1", selected: false},
  {value: "value2", selected: false}
  //there cannot be another object with value = "value1" within the collection.
]

所以我正在寻找不重复的值数据(在对象的数组中),而不仅仅是字符串数组中的值,如本问题所要求的那样。这不是我第一次在一些 JS 代码中做这样的事情。

所以我做了以下事情:

let valueIndex = {};
let values = []
//I had the source data in some other and more complex array. 
for (const index in assetsArray) 
{
    const element = assetsArray[index];
    if (!valueIndex[element.value])
    {
        valueIndex[element.value] = true;
        values.push({
            value: element.value,
            selected: false
        });
    }
}

我只是使用另一个对象作为索引,因此对象中的属性将永远不会被重复。这段代码很容易阅读,并且肯定与任何浏览器兼容。也许有人会带来更好的东西。欢迎大家分享! 希望这对其他人有帮助。