Как фильтровать / уменьшать массив объектов с указанными c динамическими ключами на основе другого массива - PullRequest
1 голос
/ 16 апреля 2020

Я собираюсь объяснить мою проблему. У меня нет времени больше думать об этом, и у меня есть блокировщик, и я не могу понять это, поэтому любая помощь будет оценена. Например, у меня есть массив объектов (это может быть массив с более чем 100 элементами):

  const arr = [
    { value: '1', id: 1, number: 1, other: 'example', data: '6' },
    { value: '2', id: 2, number: 2, other: 'example', data: '7' },
    { value: '3', id: 3, number: 3, other: 'example', data: '8' },
    { value: '4', id: 4, number: 4, other: 'example', data: '9' },
    { value: '5', id: 5, number: 4, other: 'example', data: '10' },
  ];

, а в другом массиве у меня есть строки, которые содержат определенные c ключи, такие как:

  const keys = ['value', 'id', 'number'];

и моя проблема в том, что я хочу вернуть переменную arr, содержащую только объекты, основанные на значениях переменной keys. Примерно так:

 const arr = [
    { value: '1', id: 1, number: 1 },
    { value: '2', id: 2, number: 2 },
    { value: '3', id: 3, number: 3 },
    { value: '4', id: 4, number: 4 },
    { value: '5', id: 5, number: 4 },
  ];

Я бы хотел получить его динамически, поскольку значения в переменной keys не являются постоянными и могут быть value, other, data или только data или id и other et c.

Ответы [ 2 ]

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

Создайте функцию, которая будет возвращаться на основе массива ключей, и используйте эту функцию для сопоставления ..

const arr = [
        { value: '1', id: 1, number: 1, other: 'example', data: '6' },
        { value: '2', id: 2, number: 2, other: 'example', data: '7' },
        { value: '3', id: 3, number: 3, other: 'example', data: '8' },
        { value: '4', id: 4, number: 4, other: 'example', data: '9' },
        { value: '5', id: 5, number: 4, other: 'example', data: '10' },
      ];

    const keys = ['value', 'id', 'number'];

    function pick(obj, keys){
        let result = {};
        for(let i=0; i<keys.length; i++){
            result[keys[i]] = obj[keys[i]];
        }
        return result;
    }

    let finalArr = arr.map( value => pick(value,keys));

    console.log(finalArr);
1 голос
/ 16 апреля 2020

Вы можете сделать это, используя Array.prototype.map() и reduce.

const arr = [
    { value: '1', id: 1, number: 1, other: 'example', data: '6' },
    { value: '2', id: 2, number: 2, other: 'example', data: '7' },
    { value: '3', id: 3, number: 3, other: 'example', data: '8' },
    { value: '4', id: 4, number: 4, other: 'example', data: '9' },
    { value: '5', id: 5, number: 4, other: 'example', data: '10' },
];

const keys = ['value', 'id', 'number'];

const res = arr.map(item => keys.reduce((acc, key) => ({...acc, [key]: item[key]}), {}));

console.log(res);
.as-console-wrapper{min-height: 100% !important; top: 0;}
...