如何从对象数组返回匹配的属性值

时间:2018-09-06 12:57:57

标签: javascript typescript lodash

我有下面的数组,

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实现此目标。

5 个答案:

答案 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)

使用filterfindIndex

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>