Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何用2“初始化对象变量;步骤:`objectVariable[step1][step2]=结果`_Javascript_Variables_Ecmascript 6_Javascript Objects_Reduce - Fatal编程技术网

Javascript 如何用2“初始化对象变量;步骤:`objectVariable[step1][step2]=结果`

Javascript 如何用2“初始化对象变量;步骤:`objectVariable[step1][step2]=结果`,javascript,variables,ecmascript-6,javascript-objects,reduce,Javascript,Variables,Ecmascript 6,Javascript Objects,Reduce,原始问题: 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.dataRe

原始问题:

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 = {};
});
我正在尝试创建一个新对象,但插入有点复杂:

我正在对象内部生成一个对象

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处理程序中出错:“TypeError:无法设置未定义的属性“2017-02-01”

在线:

newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].name][that.dataResult[dataRow.data_id].ts] = that.dataResult[dataRow.data_id];
我的尝试:

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 = {};
});
  • 将此行(更改为不需要的结果,但仅用于测试)更改为只有一个键对象(而不是2个)时,它会起作用:


  • 我尝试过这样做-添加一个临时变量并将结果推给它,起初我以为我解决了问题,但在检查了几次之后,我注意到结果被复制了,“cat_id”也被复制了

    主要问题:

    以这种方式设置对象变量的正确方法是什么:

    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 = {};
    });
    
    可以使用函数查看对象是否具有属性

    例如

    let myObject = {};
    let prop = "myProperty";
    let prop 2 = "mySecondProperty"
    
    if(!myObject.hasOwnProperty(prop)){
       myObject[prop] = {};
    }
    
    myObject[prop][prop2] = ....
    
    如果没有定义“myObject[prop]”,您可以在循环中使用它并设置“default”值

    您可以执行
    (objectVariable[step1]=objectVariable[step1]|{})

    var objectVariable={};
    var step1='a';
    var step2='b';
    var result='hello world';
    (objectVariable[step1]=objectVariable[step1]| |{})[step2]=结果;
    
    console.log(objectVariable)
    自从ECMAScript 2015(ES6)以来,您可以通过以下方式声明对象:

    const step1='firstStep',step2='secondStep';
    设obj={
    [步骤1]:{
    [步骤2]:“值”
    }
    };
    
    console.log(obj[step1][step2])关于
    objectVariable[step1][step2]=result
    ,您可以使用Object.assign加上计算属性,如:

    constmyobj={someProp:“someValue”};
    const foo=“propertyFoo”;
    const bar=“propertyBar”;
    赋值(myObj,{[foo]:{[bar]:“baz”});
    
    console.log(myObj)
    能否请您添加一个
    window.datas
    示例,以便我们查看数据结构?试图通过阅读这些冗长的陈述来理解它是令人讨厌的。您是否可以控制window.datas的结构?因为从代码判断,如果数据是数组,代码可能会变得更简单、更短。@Shilly你这么说很有趣,因为我之前的文章讨论了这一点,并决定实际使用对象:前10或20个对象键的JSON.stringify()示例就足够了。不需要发布所有2k+。这似乎是对的,但因为它在一个循环中,我必须将项目添加到同一个数组中(附加到“step1”和“step2”)。你能在评论中也提到这个问题吗?我尝试用对象扩展操作符
    {…}
    做了一些变化,得到了奇怪的结果。这是我最后一次尝试:
    newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].name]={…newObj[that.dataResult[dataRow.data_id].ts]:{[dataRow.data_id]:that.dataResult[dataRow.data_id]}
    我编辑了我的答案,其中包括一个带有循环和分解结构的示例,但我不确定它是否真的有用,因为我不知道所有对象属性都是什么样子。你能提供一些样品吗?或者给一个更清晰的片段?