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