var links = {
1:{source: 0, target: 1},
2:{source: 0, target: 2},
3:{source: 0, target: 3},
4:{source: 0, target: 4},
5:{source: 0, target: 1},
6:{source: 0, target: 4}
};
这是我的数据,我想通过参数来获取它的唯一对象:target like
var result= {
1:{source: 0, target: 1},
2:{source: 0, target: 2},
3:{source: 0, target: 3},
4:{source: 0, target: 4},
};
您可以通过使用带有Array.from
的Set
删除重复项而不用下划线来执行此操作:
const links = [{source: 0, target: 1}, {source: 0, target: 2}, {source: 0, target: 3}, {source: 0, target: 4}, {source: 0, target: 1}, {source: 0, target: 4}]
const res = Array.from(new Set(links.map(JSON.stringify)), JSON.parse);
console.log(res);
但是,如果target
与另一个target
属性相同,如果对象中的另一个属性不同(即它将删除重复的对象),则上面将保留元素。
要根据数组中的键删除特定重复项,可以使用.reduce
:
const links = [{source: 0, target: 1}, {source: 0, target: 2}, {source: 0, target: 3}, {source: 0, target: 4}, {source: 0, target: 1}, {source: 0, target: 4}];
const res = Object.values(links.reduce((acc, obj) => {
const {target} = obj;
acc[target] = obj;
return acc;
}, {}));
console.log(res);
var visited = {}
Object.keys(links).forEach((key) => {
var val = links[key].target;
if(!visited[val]) {
visited[val] = true;
} else {
delete links[key];
}
})
如果你不想编辑现有的对象,那么而不是删除在新对象中推送它;注意:首选阵列而不是场景中的对象。
var links = {
1: { source: 0, target: 1 },
2: { source: 0, target: 2 },
3: { source: 0, target: 3 },
4: { source: 0, target: 4 },
5: { source: 0, target: 1 },
6: { source: 0, target: 4 }
};
links = Object.keys(links).reduce((pre, cur) => {
pre[cur] = JSON.stringify(links[cur])
return pre
}, []);
links = [...new Set(links)].reduce((pre, cur, idx) => {
if (cur) {
pre[idx] = JSON.parse(cur)
}
return pre
}, {});
你可以试试这种方式。这符合您的预期输入和输出。
这里,创建一个可哈希的对象,并根据source
和target
属性生成密钥。可清除对象的目的是在我们之前推送相同的值时保持跟踪。
var links = {
1: { source: 0, target: 1 },
2: { source: 0, target: 2 },
3: { source: 0, target: 3 },
4: { source: 0, target: 4 },
5: { source: 0, target: 1 },
6: { source: 0, target: 4 }
};
var counter = 1,
hash = {},
result = {};
var linkArray = Object.values(links);
linkArray.forEach(function(elem) {
const key = elem.source + '' + elem.target;
if(!hash[key]){
hash[key] = 1;
result[counter] = elem;
counter++;
}
});
console.log(result);
希望对你有帮助。谢谢!