如何return JS 中所有重复的具有相同值的对象?

How to return all the duplicated objects with same values in JS?

有没有聪明的方法让所有对象都具有相同的值?

[
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
]

理想的结果是:

[
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'}
]

我想计算所有值的出现次数,但这似乎不是一个好方法。

欣赏!

我想你要找的是排序算法,然后可能是过滤函数。

希望对您有所帮助。

您可以通过这样做对代码进行排序:

let data = [
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
];

let cleanData = data.sort((a, b) = >{
    return a.value > b.value;
});

cleanData.filter((data) => data.value === 'requestedValue');

我不确定效率如何,但这可以让您获得想要的结果。 顺便说一下,你可以跳过我做的订购阶段。

在我看来,最简单的算法是创建具有值的地图并根据它进行过滤。所以是的,基本上你会计算所有值的出现次数。

这里是例子:

const valuesMap = {}
const input = [
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
]

input.forEach(item => {
    if (!valuesMap[item.value]) {
         valuesMap[item.value] = 1
    } else {
         valuesMap[item.value] += 1
    }
})

const output = input.filter(item => {
     return valuesMap[item.value] > 1
})

简单的解决方案使用reduce with impurity(不再需要映射。)

const data = [
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
]
const final = []
const counter = (data) => {
  return data.reduce((x, i) => {
    if(!x[i.value]) x[i.value] = 0
    x[i.value]++
    if(x[i.value] > 2) final.push(i)
    if(x[i.value] > 1) final.push(i, i)
    return x;
  }, {})
}
counter(data)
console.log(final)

您可以使用 Map 并根据地图的值过滤数组。

var array = [{ name: 'a' , value: '123' }, { name: 'b' , value: '123' }, { name: 'c' , value: '1234' }, { name: 'd' , value: '1234' }, { name: 'e' , value: '12345' }, { name: 'f' , value: '123456' }],
    counts = array.reduce((m, { value }) => m.set(value, m.has(value)), new Map),
    result = array.filter(({ value }) => counts.get(value));

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