使用underscore.js查找基于对偶属性的唯一值

Using underscore.js to find unique values based on dual properties

本文关键字:属性 唯一 underscore js 查找 使用      更新时间:2023-09-26

使用Undercore.js,我试图在一个数组中获得唯一值,如下所示:

var links = [
    {source: 0, target: 1},
    {source: 0, target: 2},
    {source: 0, target: 3},
    {source: 0, target: 4},
    {source: 0, target: 1},
    {source: 4, target: 0}
];

结果是这样的:

var links = [
    {source: 0, target: 1},
    {source: 0, target: 2},
    {source: 0, target: 3},
    {source: 0, target: 4},
];

我想摆脱具有相同来源的链接&当然,目标对的顺序相同(0,1==0,1),但也希望去掉那些相同但相反的(0,4==4,0)。

我确信我可以用双嵌套的_.map()来完成它,但我想看看是否有Undercore魔术师有一个更干净、更合适的解决方案。

我认为_.uniq就是答案。

uniq_.uniq(array, [isSorted], [iteratee])

更多信息

我相信您可以使用第三个参数(iteratee)来提供一个自定义转换函数,该函数将在比较之前首先应用。

使用_.uniq的示例(http://jsfiddle.net/muto6zs1/):

function(item) {
  // sort array of source and target and join it into a delimited string for a unique value
  return [item.source, item.target].sort().join(',');
}

您已经使用下划线得到了答案,但为了帮助您了解幕后发生了什么,我提供了一个JavaScript示例:

var links = [
    {source: 0, target: 1},
    {source: 0, target: 2},
    {source: 0, target: 3},
    {source: 0, target: 4},
    {source: 0, target: 1},
    {source: 4, target: 0}
];
// create a temporary buffer to hold unique keys
var keys = {};
links.forEach(function(item, index) {
  // this is the essential part of the uniqueness test
  var item = [item.source, item.target].sort();
  if (!keys.hasOwnProperty(item)) {
      keys[item] = index;
  }
});
// iterate over the unique keys and reconstruct a new array
links = Object.keys(keys).reduce(function(prev, index) {
  prev.push(links[keys[index]]);
  return prev;
}, []);
console.log(links);