我在数组之间进行一些检查。它在NodeJS中。
问题是:
我有一个数组:
var items = [];
比插入一些值:
items[0] = {a:1, b:222};
items[1] = {a:1, b:333};
items[2] = {a:1, b:222};
items[3] = {a:1, b:4444};
items[4] = {a:1, b:222};
所以,我需要做的是:抛出所有数组并删除具有相同'b'值的项目。
示例:
过滤后,它应如下所示:
items[0] = {a:1, b:222};
items[1] = {a:1, b:333};
items[2] = {a:1, b:4444};
当你看到索引2和4的元素消失了,因为它们与索引0处的元素具有相同的b值。
如何在JavaScript中编写这个小代码?
答案 0 :(得分:2)
您正在寻找Array.prototype.filter函数:
var bValues = {};
items = items
.filter(function(item) {
return bValues[item.b] === undefined && (bValues[item.b] = true);
});
这可以通过检查我们是否看到特定的bValue
并返回false
来实现。如果我们没有,我们会在bValues
地图上设置该值并返回true
。
编辑:我喜欢@dandavis的漂亮建议,使用this
绑定参数来减少变量名称:
items = items
.filter(function(item) {
return this[item.b] === undefined && (this[item.b] = true);
}, {});
答案 1 :(得分:0)
如果我正确理解您的问题,您希望执行传递以删除每个重复的public GetOrderResponse Get(GetOrder request)
{
return new GetOrderResponse()
{
...
}
}
值。这实际上是一个算法问题而不是Javascript问题。有很多方法可以做到这一点,但我的答案将集中在表现上。
以下是在Javascript(b
)中执行此操作的更快方法之一:
O(n)
此时,您可以专注于抽象出重复删除,以使其成为可重用的功能。
答案 2 :(得分:0)
所有答案都提出了大致相同的算法,因此归结为最易理解的内容。这是一个想法。我们首先用英语描述算法:
- 在所有项目中,请保留第一个
b
。- 对于某个项目,"首先
醇>b
"表示此项的索引等于其b
属性等于项的b
属性的第一个元素的索引。
现在我们几乎可以将英语转换为JavaScript。
function removeDuplicatesOfB(items) {
// Is this item the first in the array with its b property?
function firstB(item, idx) {
return idx // The index of this item
=== // equal to
items.findIndex( // the index of the first
e => // element
e.b // whose b property
=== // is equal to
item.b // the b property of the item.
)
;
}
return items . // Of all the items,
filter( // keep those with
firstB // the first b.
)
;
}
或者,以非评论形式:
function removeDuplicatesOfB(items) {
function firstB(item, idx) {
return idx === items.findIndex(e => e.b === item.b);
}
return items.filter(firstB);
}
下划线的_.uniq
可以在睡眠中通过传递一个"谓词"告诉它如何比较对象以确定它们是否是相同的":
_.uniq(items, function(item) { return item.b; })