Уничтожение и / или массовое присвоение в ES6 - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 2 источника данных.Одним из источников является «шаблон» того, что приемлемо для данных.Однако второй источник может содержать большой объем данных, которые мне не нужны (более 100 свойств в JSON).Вот схемы:

// Only store the data we care about.  Only a small subset of
// data that I need for this particular dataset.
state = {
    isDirty: false,
    data: {
        name: '',
        address: '',
        city: '',
        state: ''
    }
 }

Второй источник будет иметь 4 атрибута в схеме данных выше (плюс многие другие, которые меня не интересуют).В настоящее время я назначаю их следующим образом:

let updatedData = {};

for(const key in this.state.data) {
  updatedData[key] = someDataSource[key];
}

this.state.data = updatedData;

Используя ES6 и, возможно, уничтожая, есть ли лучший способ массового назначения переменных, подобных этой?

Еще раз спасибо!

РЕДАКТИРОВАТЬ

Добавлено для уточнения назначения после цикла.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Свойства могут быть исключены и изменены в JSON.parse reviver :

var o = JSON.parse('{"a":1, "b":2}', (k, v) => k === 'a' ? void 0 : k === 'b' ? 3 : v)

console.log( o )
0 голосов
/ 31 мая 2018

Lodash pick может использоваться для выбора определенных клавиш, или вспомогательная функция может использоваться для той же цели:

const pick = (obj, keys) => Object.keys(obj)
    .filter((key) => keys.indexOf(key) >= 0)
    .reduce(
        (newObj, key) => Object.assign(newObj, { [key]: obj[key] }),
        {}
    );

Это уже предлагается во многих смежных вопросах.Что характерно для этого вопроса:

this.state.data = pick(someDataSource, Object.keys(this.state.data));
0 голосов
/ 31 мая 2018

Трюк, который вы можете сделать (трюк , потому что он требует проглатывания ошибки ), состоит в том, чтобы использовать нерасширяемый объект, используя Object.preventExtensions, а затем используйте Object.assign, чтобы заполнить его данными ( в блоке try / catch ).

// Only store the data we care about.  Only a small subset of
// data that I need for this particular dataset.
state = {
    isDirty: false,
    data: {
        name: '',
        address: '',
        city: '',
        state: ''
    }
 }

const newData = {
    name:'name',
    address:'address',
    city:'city',
    state:'state',
    phone:'phone',
    zip:'zip'
}

const updatedData = Object.preventExtensions({...state.data});

try{
   Object.assign(updatedData, newData);
} catch(throwaway){};

console.log(updatedData);

И как функция для повторного использования

function schemaMerge(schema, data) {
  const mergedData = Object.preventExtensions({...schema});

  try {
    Object.assign(mergedData, data);
  } catch (throwaway) {};
  
  return ({...mergedData}); // create a new object from the merged one so that it no longer is extensionless
}

// Only store the data we care about.  Only a small subset of
// data that I need for this particular dataset.
state = {
  isDirty: false,
  data: {
    name: '',
    address: '',
    city: '',
    state: ''
  }
}

const newData = {
  name: 'name',
  address: 'address',
  city: 'city',
  state: 'state',
  phone: 'phone',
  zip: 'zip'
}


const updatedData = schemaMerge(state.data, newData);

state.data = updatedData;

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