как l oop через вложенные объекты и поля pu sh после сравнения их в javascript / es6 - PullRequest
3 голосов
/ 14 июля 2020

У меня есть следующие 3 элемента из структуры данных ниже:

как

  • Предположим, что group имеет три поля: id, name, accountNumber, и, поскольку у меня три элемента, два из них имеют одинаковые accountNumber.

Что я хочу сделать

Я хочу написать функцию с javascript/es6 до l oop через эти объекты, проверьте id и accountNumber в group и pu sh, что в новом массиве объектов с именем results. (Если какой-либо идентификатор содержит тот же accountnumber, его не следует помещать в новый массив ниже)

# new array 
# results = [
{
    id: 1,
    accountNumber: 2289,
  },
  {
    id: 2,
    accountNumber: 9920,
  },
]

Из-за моего фона с python я изо всех сил пытаюсь выполнить sh это. любая помощь будет очень кстати.

Ответы [ 3 ]

3 голосов
/ 14 июля 2020

Предполагая, что все остальные свойства объекта данных не имеют значения, и я правильно представил ваши данные (изображение обрезано):

const data = [
  {group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]

const result = data.reduce((result, obj) => { 
    if(result.some(ele => ele.accountNumber === obj.group.accountNumber)) return result; 
    result.push({id: obj.group.id, accountNumber: obj.group.accountNumber});
    return result;
}, []);

//will filter out id 3 since it has same accountNumber as id 1
console.log(result)
1 голос
/ 14 июля 2020

Этот пример должен дать вам представление о том, как отфильтровать одинаковые номера счетов

data=[{id:2, name:"foo", accountNumber:20209393},{id:2, name:"bar", accountNumber:2020559393},{id:2, name:"foo", accountNumber:20209393}]

result=data.reduce((acc,curr)=>{
  if(acc.length==0) {acc.push(curr)}
  else {
    acc.some(o => {
     if(o.accountNumber==curr.accountNumber){
      return acc
     }
     else acc.push(curr)
  })

}
  return acc
},[])
console.log(result)
0 голосов
/ 07 сентября 2020

На самом деле вы можете добиться этого немного более кратко, используя Map.

по дизайну, Map имеет только одно значение для каждого ключа, поэтому мы можем индексировать по accountNumber, который будет быстрее проверять для повторных появлений.

Кроме того, Map.set() возвращает всю карту, что удобно при использовании в Array.reduce() функциях, потому что мы всегда должны возвращать аккумулятор внутри таких.

То же может быть достигнуто с помощью словаря (Object) - см. второй фрагмент - но словарь не так удобен, как Map при использовании в Array.reduce() функциях.

Использование карты:

const data = [
  {group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => result.get(obj.group.accountNumber);
const result = data.reduce((result, obj) => !exists(result, obj) ? result.set(obj.group.accountNumber, {id: obj.group.id, accountNumber: obj.group.accountNumber}) : result, new Map())
console.log([...result.values()])

Использование словаря:

const data = [
  {group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
  {group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]

const exists = (result, obj) => !!result[obj.group.accountNumber];
const result = data.reduce((result, obj) => {
  result[obj.group.accountNumber] = !exists(result, obj) ? {id: obj.group.id, accountNumber: obj.group.accountNumber} : result[obj.group.accountNumber];
  return result;
}, {});
console.log(Object.values(result))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...