Уничтожить свойства объекта из свойств, предоставленных в массиве - PullRequest
1 голос
/ 10 марта 2020

Мне нужно создать функцию getPropertiesData(list), которая принимает список свойств и объект, содержащий эти свойства, и возвращает только свойства объекта, которые соответствуют в списке.

Иллюстрация:

function getPropertiesData(['x', 'y']){
    const o = {
        'x': 1, 
        'y': 2, 
        'z': 3
       }

    // Will return 
    return {
        'x': 1,
        'y': 2
       }
    // not including the 'z' variable since it was not specified as input in the list array
}

Как это сделать в javascript?

Ответы [ 5 ]

2 голосов
/ 10 марта 2020

Просто создайте новый объект, сопоставив требуемый ключ со значениями.

function getPropertiesData(properties) {
    const o = { x: 1, y: 2, z: 3 };
    return Object.fromEntries(properties.map(k => [k, o[k]]));
}

console.log(getPropertiesData(['x', 'y']));
2 голосов
/ 10 марта 2020

Вы можете использовать Object.entries, чтобы получить массив парных пар ключ / значение для объекта. Затем filter массив записей путем включения в массив wantedKeys. Наконец, создайте объект из выбранных пар, используя Object.fromEntries.

const o = {a: 1, b: 2, c: 3};
const wantedKeys = ["a", "c"];

const selected = Object.fromEntries(
  Object.entries(o)
        .filter(([k, v]) => wantedKeys.includes(k))
);

console.log(selected);

Это может быть медленным на больших объектах, поэтому вы можете использовать map и filter, чтобы связать сложность с массивом wantedKeys .

Если вы превращаете это в функцию, нет смысла жестко кодировать объект. Я бы добавил это как параметр:

const pickFromObj = (o, wantedKeys) => Object.fromEntries(
  wantedKeys.filter(e => e in o)
            .map(e => [e, o[e]])
);

console.log(pickFromObj({a: 1, b: 2, c: 3}, ["a", "c"]));
2 голосов
/ 10 марта 2020

Вы можете использовать Object.assign() метод для этого требования, например:

function getPropertiesData(arr) {
  const o = { 'x': 1, 'y': 2, 'z': 3 }
  return Object.assign({}, ...arr.map(a => ({[a]: o[a]})));
}

console.log(getPropertiesData(['x', 'y']))

Если вам нужно получить значения только для ключей, существующих в объекте o, вы можете использовать это:

function getPropertiesData(arr) {
  const o = { 'x': 1, 'y': 2, 'z': 3 }
  return Object.assign({}, ...arr.map(a => o.hasOwnProperty(a) ? ({[a]: o[a]}) : null));
}

console.log(getPropertiesData(['x', 'y']))
console.log(getPropertiesData(['w', 'x']))
1 голос
/ 10 марта 2020

Функция должна принимать объект o и массив свойств props. Используйте Array.prototype.reduce на входе props, чтобы создать новый объект вывода, используя Object.assign.

const getProperties = (o = {}, props = []) =>
  props.reduce
    ( (r, k) => Object.assign(r, { [k]: o[k] })
    , {}
    )

const result =
  getProperties({ a: 1, b: 2, c: 3 }, [ 'a', 'b', 'z' ])

console.log(result)
// { a: 1, b: 2, z: undefined }
1 голос
/ 10 марта 2020

Вы можете сделать это, перебирая пары ключ / значение в объекте, и использовать массив Reduce для выделения искомых. Здесь, Reduce создает новый объект, перебирая все значения объекта.

const getPropertiesData = (obj, props) =>
  Object.entries(obj)
    .reduce((result, [key, value]) =>
      props.includes(key) ? {...result, [key]:value} : result
    , {})

Затем вы можете проверить его, используя ваш объект, o:

const o = {
 'x': 1, 
 'y': 2, 
 'z': 3
}

console.log(getPropertiesData(o, ['x', 'y']))
...