如何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; }
有没有聪明的方法让所有对象都具有相同的值?
[
{ 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; }