Фильтр javascript объект массивов для всех ключей - PullRequest
0 голосов
/ 01 апреля 2020

Я новичок в javascript. Допустим, у меня есть следующий объект из массивов

const object1 = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
};

Я хотел бы создать новый объект, который фильтрует данные людей старше значения (например, 30). Я пытался отфильтровать, Object.fromEntries, Object.entries, но я не мог найти возможное решение. Результат должен быть

NewObject {
  name: Array['David', 'Simon', 'Lukas'],
  age: Array[41, 33, 50],
  salary: Array[100, 120, 150]
};

Спасибо за любые предложения

Ответы [ 4 ]

2 голосов
/ 01 апреля 2020

Преобразуйте текущую структуру в более удобную структуру данных (JSON), например:


const workers = [
  {
    name   : 'David',
    age    : 41,
    salary : 100
  },
  {
    name   : 'Juan',
    age    : 22,
    salary : 80
  },
  {
    name   : 'Simon',
    age    : 33,
    salary : 120
  },
  {
    name   : 'Lukas',
    age    : 50,
    salary : 150
  }
];

const olderThan30 = workers.filter(worker => worker.age > 30);

console.log(olderThan30);
// This console log will return this, an array of JSON objects that match the criteria of the filter function.
// [
//  { name : "David", age : 41, salary : 100 },
//  { name : "Simon", age : 33, salary : 120 },
//  { name : "Lukas", age : 50, salary : 150 }
// ]

Надеюсь, это поможет.

1 голос
/ 01 апреля 2020

Как упомянуто @ CharlieFi sh, ваша структура данных не является обычным способом ведения дел, поэтому вы должны сделать это вместо этого:

const employees = [
  { name: 'David', age: 41, salary: 100 },
  { name: 'Simon', age: 33, salary: 120 },
  { name: 'Lukas', age: 50, salary: 150 },
];

const over30 = employees.filter(employee => employee.age > 30);

Если вам действительно нужно придерживаться вместо шаблона, вы все равно можете это сделать, но вам придется фильтровать каждый отдельный массив:

const isOver30 = (_, i) => object1.age[i] > 30;

const thoseOver30 = {
  name: object1.name.filter(isOver30),
  age: object1.age.filter(isOver30),
  salary: object1.salary.filter(isOver30)
}

... или менее дублирующий:

const thoseOver30 = Object
  .entries(object1)
  .map(([prop, array]) => ({ [prop]: array.filter(isOver30) }))
  .reduce((result, props) => Object.assign(result, props), {});
0 голосов
/ 01 апреля 2020

Простое для понимания решение:

const maxAge = 30;
const object = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
};

const result = { name: [], age: [], salary: [] };

for (let i = 0; i < object.name.length; i++) {
    if (object.age[i] <= maxAge) {
        result.name = [...result.name, object.name[i]];
        result.age = [...result.age, object.age[i]];
        result.salary = [...result.salary, object.salary[i]];
    }
}
console.log(result);
0 голосов
/ 01 апреля 2020

Вы можете создать один объект, где ключи являются индексами элементов, где age >= 30, а затем использовать этот объект в качестве таблицы ha sh для фильтрации.

const data = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
}

const hash = data.age.reduce((r, e, i) => {
  if (e >= 30) r[i] = true;
  return r;
}, {})

for (let i in data) {
  data[i] = data[i].filter((_, j) => hash[j])
}

console.log(data)

Вы также можете использовать другую структуру данных для получения массива объектов с помощью метода reduce, а затем просто применить фильтр.

const data = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
}

const result = Object
  .entries(data)
  .reduce((r, [k, v]) => {
    v.forEach((e, i) => {
      if (!r[i]) r[i] = {}
      r[i][k] = e;
    })

    return r;
  }, [])
  .filter(({ age }) => age >= 30)

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...