Javascript 如何计算数组中某个值的出现次数而不进行变异

Javascript 如何计算数组中某个值的出现次数而不进行变异,javascript,arrays,sorting,functional-programming,Javascript,Arrays,Sorting,Functional Programming,我目前有一个数组,其中包含所有具有相同序列号的部件。我想做的是只过滤掉序列号和零件号都相同的零件。我目前能够获得所有唯一零件号的列表,但我一辈子都不知道如何仅提取具有相同零件号和相同序列号的项目。数组按序列号排序,因此 dupes = [ [{ sn: 001, partNum: 2505}] [{ sn: 001, partNum: 9999}] [{ sn: 001, partNum: 9999}], [{ sn: 002, partNum: 1234}] [{ sn: 002, partN

我目前有一个数组,其中包含所有具有相同序列号的部件。我想做的是只过滤掉序列号和零件号都相同的零件。我目前能够获得所有唯一零件号的列表,但我一辈子都不知道如何仅提取具有相同零件号和相同序列号的项目。数组按序列号排序,因此

dupes = [
[{ sn: 001, partNum: 2505}]
[{ sn: 001, partNum: 9999}]
[{ sn: 001, partNum: 9999}],
[{ sn: 002, partNum: 1234}]
[{ sn: 002, partNum: 1234}],
[{ sn: 003, partNum: 555}]
[{ sn: 003, partNum: 8675}]]
我试图得到的是一个只包含重复项的数组

[{ sn: 001, partNum: 9999}]
[{ sn: 001, partNum: 9999}],
[{ sn: 002, partNum: 1234}]
[{ sn: 002, partNum: 1234}]
我一整天都在努力解决这个问题,还没有找到一个不使用突变的好方法。如果零件号出现两次,是否有办法过滤掉“序列号”?我还必须检查每个零件号,因为在一些情况下,我看到相同的序列号被用于两个不同的零件号,每次两次,如果这样做的话。 任何帮助都会很棒。。。严重卡在这里

编辑:

我最终以另一种方式完成了这项任务。不过,我确实找到了一个很好的函数,它允许您计算数组中某个项的所有出现次数

function count(arr) {
  return arr.reduce((prev, curr) => (prev[curr] = ++prev[curr] || 1, prev), {})
}

我在这里找到了它

如果你想要它,所有的副本:

var重复=[
[{sn:001,partNum:2505}],
[{sn:001,partNum:9999}],
[{sn:001,partNum:9999}],
[{sn:002,partNum:1234}],
[{sn:002,partNum:1234}],
[{sn:003,partNum:555}],
[{sn:003,partNum:8675}]]
var结果=[];

对于(i=1;iMcRist的解决方案有很多问题。例如,如果它们不是相邻的,它不会找到重复项:

var dupes=[{sn:001,partNum:2505}]
,[{sn:001,partNum:9999}]//元素1
,[{sn:002,partNum:1234}]//元素2
,[{sn:001,partNum:9999}]//元素1的副本
,[{sn:002,partNum:1234}]//元素2的副本
,[{sn:003,partNum:555}]
,[{sn:003,partNum:8675}]
];
var结果=[];
对于(变量i=0,j=1;jconsole.log(JSON.stringify(result));
能否显示预期输出的示例?因此结果应该是[{sn:001,partNum:9999}]和[{sn:002,partNum:1234}]?@JohnEllmore我更新了我的代码,以展示我理想的目标。你是在寻找一个普通的JS解决方案?还是你愿意使用像Lodash这样的库?@JohnEllmore我试图让一切都普通化。我曾想过做类似的事情,但不是“推送”数组的突变?我知道数组<代码>结果是一个空数组,将在函数范围内,但这会使函数本身“不纯”吗由于突变?或者只要没有突变超出功能范围,功能仍然是纯的?@JustinGagnon我添加了一个没有突变的解决方案also@JohnEllmore这就是您想要的吗?您的解决方案是错误的。有关详细信息,请参阅我的。