如何从对象中的特定参数中找到对象中的唯一对象

问题描述 投票:0回答:4
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},
};
javascript underscore.js
4个回答
1
投票

您可以通过使用带有Array.fromSet删除重复项而不用下划线来执行此操作:

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

0
投票
var visited = {}
Object.keys(links).forEach((key) => {
   var val = links[key].target;
   if(!visited[val]) {
      visited[val] = true;
   } else {
      delete links[key];
   }
})

如果你不想编辑现有的对象,那么而不是删除在新对象中推送它;注意:首选阵列而不是场景中的对象。


0
投票
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
}, {});

0
投票

你可以试试这种方式。这符合您的预期输入和输出。 这里,创建一个可哈希的对象,并根据sourcetarget属性生成密钥。可清除对象的目的是在我们之前推送相同的值时保持跟踪。

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

希望对你有帮助。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.