Как я могу создать новый объект, который содержит только пары ключ / значение, указанные в массиве?

Я хочу передать функции массив ключей и объект и вернуть новый объект, который содержит только пары ключ / значение, которые я указываю в массиве ключей.

Итак, если бы у меня был такой объект:

{"name" : "John Smith", "position" : "CEO", "year" : "2019" }

И я передал массив

["name", "year"]

, новый возвращенный объект был бы:

{"name" : "John Smith", "year" : "2019" }
[118 Я играл с этим, но мой код не работает.

function parse(keys, data) {
    let obj = JSON.parse(data);

    let newObj = {};

    keys.array.forEach(element => {
        newObj[element] = obj.element;
    });

    return newObj;
};
2
задан trincot 27 June 2019 в 17:59
поделиться

5 ответов

вы делаете это, используя filter и Object entries, или вы также можете использовать reduce.

const person = {
  "name": "John Smith",
  "position": "CEO",
  "year": "2019",
  "job": "front-end"
};

const formatObject = (arr, o) => {
  let finalObject = {};

  Object.entries(o).filter(([key, value]) => {
    if (arr.includes(key)) {
      finalObject = {
        ...finalObject,
        [key]: value
      }
    }

  });

  return finalObject;

}


console.log(formatObject(["name", "year", "job"], person))
0
ответ дан G.aziz 27 June 2019 в 17:59
поделиться

Вам не нужно делать parse. Во-вторых, эта строка keys.array.forEach неверна. Это связано с тем, что внутри keys нет клавиши array. Также замените obj.element; на data[element]

let data = {
  "name": "John Smith",
  "position": "CEO",
  "year": "2019"
}
let keys = ["name", "year"]


function parse(keys, data) {
  let newJson = {};
  keys.forEach(element => {
    newJson[element] = data[element];
  });

  return newJson;
};

console.log(parse(keys, data))
3
ответ дан brk 27 June 2019 в 17:59
поделиться

Я удалил разбор объекта, который у вас был выше, так как ваш объект не зашифрован ... Если бы он был зашифрован, то "" обернул бы весь объект ... в процессе работы вы можете просто добавить разбор при необходимости.

function parse(keys, data) {
   let newObj = {};

   for (const dataKey in data){
       for (let i = keys.length - 1; i >= 0; i--) {
           if (data.hasOwnProperty(keys[i])) {
               newObj[keys[i]] = data[keys[i]];
           }
       }
   }

   return newObj;
};
0
ответ дан Michael Paccione 27 June 2019 в 17:59
поделиться

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

function filter_obj(obj = {}, keys = [] ) {
    if ( !keys || !keys.length ) return obj;

    const desired = new Set(keys);
    const filtered = {};
    for ( [ key, value ] of Object.entries(obj) ) {
        if ( !desired.has(key) ) continue;
        filtered[key] = value;
    }
    return filtered;
}
2
ответ дан Nicholas Carey 27 June 2019 в 17:59
поделиться

Сначала добавьте эту строку {"имя": "John Smith", "положение": "генеральный директор", "год": "2019"} в единственной цитате, или Вы не должны использовать JSON.parse:

'{"name" : "John Smith", "position" : "CEO", "year" : "2019" }'

Тогда Вам не нужен массив, только ключи, ключи. массив .forEach. И obj [элемент]:

  keys.forEach(element => {
    newObj[element] = obj[element];
  });
0
ответ дан Mauricio Carlezzo 3 July 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: