我有下面的数组,
var abc = [
{name: 'name1', id: '1', value: 1},
{name: 'name2', id: '2', value: 3},
{name: 'name3', id: '3', value: 2},
{name: 'name4', id: '4', value: 2}
];
我想回来,
var abc = [
{name: 'name3', id: '3', value: 2},
{name: 'name4', id: '4', value: 2}
];
因为两个对象的值相同。如何使用lodash或javascript实现此目标。
答案 0 :(得分:3)
您可以创建一个对象,其值将是一个数组,该数组将仅包含值相同的那些对象
var abc = [{
name: 'name1',
id: '1',
value: 1
},
{
name: 'name2',
id: '2',
value: 3
},
{
name: 'name3',
id: '3',
value: 2
},
{
name: 'name4',
id: '4',
value: 2
}
];
let m = abc.reduce(function(acc, curr) {
if (!acc.hasOwnProperty(curr.value)) {
acc[curr.value] = [];
}
acc[curr.value].push(curr)
return acc;
}, {})
Object.keys(m).forEach(function(item) {
if (m[item].length > 1) {
console.log(m[item])
}
})
答案 1 :(得分:2)
var abc = [
{name: 'name1', id: '1', value: 1},
{name: 'name2', id: '2', value: 3},
{name: 'name3', id: '3', value: 2},
{name: 'name4', id: '4', value: 2}
];
const res = abc.filter(obj => {
return abc.findIndex(obj2 => obj2.id !== obj.id && obj2.value === obj.value) > -1;
});
console.log(res);
答案 2 :(得分:1)
您可以使用Array.reduce来实现此目的,而复杂度为O(n)
您可以创建一个object/map
,其键作为对象的 value属性。对于数组中的每个对象,检查对象中的值。如果值不存在,则将其添加到地图。如果值存在(重复),则将对象与存储在地图中的值一起添加到数组。您将需要重置map中的值,以免最终添加第一个值不止一次。
var abc = [{name: 'name1', id: '1', value: 1},{name: 'name2', id: '2', value: 3},{name: 'name3', id: '3', value: 2},{name: 'name4', id: '4', value: 2}];
var obj = {};
var result = abc.reduce((a,c) => {
if(obj[c.value]) {
if(obj[c.value] !== true) {
a.push(obj[c.value]);
obj[c.value] = true;
}
a.push(c);
} else obj[c.value] = c;
return a;
}, []);
console.log(result);
答案 3 :(得分:0)
您可以使用Array.prototype.reduce()在value
字段中对它们进行分组
这是这样做的方法:
var abc = [
{name: 'name1', id: '1', value: 1},
{name: 'name2', id: '2', value: 3},
{name: 'name3', id: '3', value: 2},
{name: 'name4', id: '4', value: 2}
];
var reduced = abc.reduce((accumulated, current) => {
if(!accumulated[current.value]) {
accumulated[current.value] = [];
}
accumulated[current.value].push(current);
return accumulated
}, {})
// var value = 1
var value = 2;
console.log(reduced[value])
只需更改value
字段即可获得所需的数组。
答案 4 :(得分:0)
有趣的是,您张贴了lodash标签,但没有一个lodash答案。
我想添加一个,因为它更简洁,只需使用简短形式的.countBy 和 .filter:
var data = [ {name: 'name1', id: '1', value: 1}, {name: 'name2', id: '2', value: 3}, {name: 'name3', id: '3', value: 2}, {name: 'name4', id: '4', value: 2} ];
var result = _.filter(data, ({value}) => _.countBy(data, 'value')[value] > 1)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>