如何从Angular 5中的数组中基于多个列获取唯一值?

时间:2019-07-11 12:23:32

标签: javascript arrays object lodash

我的数组类似于

[{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }]

其中需要X和Y的唯一组合。

输出为:

[{ 's':1,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }]

由于第一和第二项中的X和Y值相同。 1个必须删除。

对于UniqBy我正在使用的单列

_.uniqBy([{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }], 'y');

但是我需要2个或更多键的组合。

_.uniqBy([{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }], '[x]','[y]'); 

还有很多。他们都没有工作/

[{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y

_.uniqBy([{ 's':1,'x': 1,'y':1 }, { 's':2,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }], 'y');



[{ 's':1,'x': 1,'y':1 },{ 's':3,'x': 1,'y':2 },{ 's':4,'x': 2,'y':1 },{ 's':5,'x': 2,'y':2 }]

2 个答案:

答案 0 :(得分:2)

使用filterfindIndex来实现极其简单的原始JavaScript解决方案(Lodash中的所有操作都可以在JavaScript中完成,Lodash可以简化操作):

const arr = [{'s':1,'x':1,'y':1},{'s':2,'x':1,'y':1},{'s':3,'x':1,'y':2},{'s':4,'x':2,'y':1},{'s':5,'x':2,'y':2}];

const res = arr.findIndex(({ x, y }, i, a) => i == a.findIndex(e => e.x == x && e.y == y));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }


Lodash解决方案:

使用_.uniqBy将两个字段作为逗号分隔的值字符串进行比较:

const arr = [{'s':1,'x':1,'y':1},{'s':2,'x':1,'y':1},{'s':3,'x':1,'y':2},{'s':4,'x':2,'y':1},{'s':5,'x':2,'y':2}];

const res = _.uniqBy(arr, ({ x, y }) => `${x}${y}`);

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

使用_.uniqWith

const arr = [{'s':1,'x':1,'y':1},{'s':2,'x':1,'y':1},{'s':3,'x':1,'y':2},{'s':4,'x':2,'y':1},{'s':5,'x':2,'y':2}];

const res = _.uniqWith(arr, ({ x, y }, { x: x1, y: y1 }) => x == x1 && y == y1);

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

答案 1 :(得分:0)

您可以使用回调函数并连接数字。

console.log(_.uniqBy([
   { 's':1,'x': 1,'y':1 },
   { 's':2,'x': 1,'y':1 },
   { 's':3,'x': 1,'y':2 },
   { 's':4,'x': 2,'y':1 },
   { 's':5,'x': 2,'y':2 }
], el => `${el.x}${el.y}`)); 
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.14/lodash.min.js"></script>