Как инициализировать переменную объекта с помощью 2 «шагов»: `objectVariable [step1] [step2] = result;` - PullRequest
1 голос
/ 15 апреля 2019

Исходная проблема:

Я пытаюсь создать новый объект, но вставка немного сложная:

Я создаю объект внутри объекта,

result = Object.values(window.datas).reduce( (newObj, dataRow) => {
    if ( (user.user_id == dataRow.user_id) && (that.dataResult[dataRow.data_id] !== undefined) && (that.dataResult[dataRow.data_id].length !== 0) ) {
        newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].name][that.dataResult[dataRow.data_id].ts] = that.dataResult[dataRow.data_id];
    }
    return newObj;
}, {} );

Я получаю эту ошибку:

Ошибка в v-on обработчике: «Ошибка типа: невозможно установить свойство« 2017-02-01 »из неопределенного» * ​​1013 *

в строке:

newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].name][that.dataResult[dataRow.data_id].ts] = that.dataResult[dataRow.data_id];

Что я пробовал:

  1. При изменении этой строки (на нежелательный результат, но только длятестирование) иметь только один ключевой объект (вместо 2), и он работает:

newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].name] = that.dataResult[dataRow.data_id];

Я пытался сделать что-то вроде этого - добавив временную переменную и выдав ей результаты, вначале я думал, что решил проблему, но после просмотра этого несколько раз я заметил, что результаты дублируются и "cat_id"S дублируются.
result = Object.values(window.datas).reduce( (newObj, dataRow) => {
    if ( (user.user_id == dataRow.user_id) && (that.dataResult[dataRow.data_id] !== undefined) && (that.dataResult[dataRow.data_id].length !== 0) ) {

        temp[that.dataResult[dataRow.data_id].ts] = that.dataResult[dataRow.data_id];
        newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].app_name] = temp;
    }
    return newObj;

}, {} );
temp = {};

Основной вопрос:

Как правильно установить переменную объекта следующим образом:

objectVariable[step1][step2] = result; 

Полный код:

let that    = this;
let result  = null;
let temp    = {};

this.activeUsers.forEach( user => {

    result = Object.values(window.datas).reduce( (newObj, dataRow) => {
        if ( (user.user_id == dataRow.user_id) && (that.dataResult[dataRow.data_id] !== undefined) && (that.dataResult[dataRow.data_id].length !== 0) ) {
            newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].app_name][that.dataResult[dataRow.data_id].ts] = that.dataResult[dataRow.data_id];
        }
        return newObj;
    }, {} );


    if (Object.entries(result).length !== 0) {
        that.usersToDatas[user.user_id] = result;
    }

    temp = {};
});

Ответы [ 4 ]

2 голосов
/ 15 апреля 2019

Начиная с ECMAScript 2015 (ES6) , вы можете объявить объект с вычисленными именами свойств :

const step1 = 'firstStep', step2 = 'secondStep';

let obj = {
  [step1]: {
    [step2]: 'value'
  }
};

console.log(obj[step1][step2]);

Внутри цикла и деструктуризация объекта:

const steps = [
  ['loopA', 'loopA_step1', 'loopA_step2', 'loopA_value'],
  ['loopB', 'loopB_step1', 'loopB_step2', 'loopB_value']
];

let obj = {
  'defaultKeyA': 'defaultValueA', // These pairs will be added in the object each
  'defaultKeyB': 'defautlValueB'  // time the loop will be done, into "loopX".
};

for (let i = 0; i < steps.length; i++) {
  const step = steps[i];
  
  // Creates the key "loopX".
  obj[step[0]] = {
    // Inserts original "obj" content into the new object.
    ...obj,
    
    // Creates the key "loopX_step1" with an object as value.
    [step[1]]: {
      // Creates the key "loopX_step2" with "loopX_value" as value.
      [step[2]]: step[3]
    }
  };
}

console.log(obj);
0 голосов
/ 15 апреля 2019

Что касается objectVariable[step1][step2] = result, вы можете использовать Object.assign плюс вычисленные свойства, такие как:

const myObj = { someProp: "someValue" };
const foo = "propertyFoo";
const bar = "propertyBar";
Object.assign(myObj, { [foo]: { [bar]: "baz" } });
console.log(myObj);
(В общем, хотя и на касательной ноте, строки вроде
newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].app_name][that.dataResult[dataRow.data_id].ts] = that.dataResult[dataRow.data_id];

просто пугают.)

0 голосов
/ 15 апреля 2019

Вы можете сделать (objectVariable[step1] = objectVariable[step1] || {})

var objectVariable = {};
var step1 = 'a';
var step2 = 'b';

var result = 'hello world';

(objectVariable[step1] = objectVariable[step1] || {})[step2] = result;

console.log(objectVariable)
0 голосов
/ 15 апреля 2019

Вы можете использовать функцию hasOwnProperty , чтобы увидеть, есть ли у объекта свойство.

для примера

let myObject = {};
let prop = "myProperty";
let prop 2 = "mySecondProperty"

if(!myObject.hasOwnProperty(prop)){
   myObject[prop] = {};
}

myObject[prop][prop2] = ....

вы можете использовать его в своем цикле и установить значение «по умолчанию», если «myObject [prop]» не определено

...