как вернуть совпавшее значение свойства из массива объекта - PullRequest
0 голосов
/ 06 сентября 2018

у меня ниже массива,

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 голосов
/ 07 октября 2018

Интересно, что вы отправили сообщение с тегом 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>
0 голосов
/ 06 сентября 2018

Вы можете сгруппировать их по полю value, используя Array.prototype.reduce ()

Вот как это сделать:

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, чтобы получить необходимый массив.

0 голосов
/ 06 сентября 2018

Вы можете создать объект, и его значением будет массив, который будет содержать только те объекты, значение которых будет таким же

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])

  }

})
0 голосов
/ 06 сентября 2018

Вы можете достичь этого, используя Array.reduce со сложностью O(n)

Вы можете создать object/map с ключом как значение свойства объекта. Для каждого объекта в массиве проверьте значение в объекте. Если значение не существует, добавьте его на карту. Если значение существует ( duplicate ), то добавьте объект в массив вместе со значением, сохраненным в карте. Вам нужно будет сбросить значение в карте, чтобы вы не добавили первое значение более одного раза.

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);
0 голосов
/ 06 сентября 2018

Использовать фильтр и findIndex .

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);
...