使用Javascript将一个对象(元素)向上移动一步

3

我有几个像这样的对象:

输入图像描述

我想把typevalue移动一步,使它们紧挨着field,然后删除data
当将departments转换为JSON时,它看起来像这样:

[
    {"field"    : "DEPARTMAN_NO",
     "data"     : { "type":"numeric" , "comparison":"eq" , "value":11 }
    },
    {"field"    : "DEPARTMAN_ADI",
     "data"     : { "type":"string" , "value":"bir" }
    }
]

我已经尝试过:

departments = grid.filters.getFilterData();
i = {};
for(var i in department) {
department = i.data;
delete.department.data;
};

但它没有起作用。


你能发布标记/代码吗?我在我的内部网络上看不到你的图片。 - El Ronnoco
@ElRonnoco,我想知道你用的是什么。 - ilhan
@ElRonnoco,我已经为您更新了。 - ilhan
你的 delete 没有起作用是因为你需要写成 delete obj[property] 的形式,其中 property 是要删除的属性。此外,你没有正确声明 i - 你应该移除 i = {}。请参考我的答案。 - El Ronnoco
4个回答

5

1) 首先,循环遍历 departments,每个元素称为 department
2) 你想要将 department.data 的属性移动到 department 中,从另一个角度来看,你也可以将 department 的属性移动到 department.data 中并返回 department.data,代码如下:

var departments = [{
        "field": "DEPARTMAN_NO",
        "data": {
            "type": "numeric",
            "comparison": "eq",
            "value": 11
        }
    }, {
        "field": "DEPARTMAN_ADI",
        "data": {
            "type": "string",
            "value": "bir"
        }
    }],
    department;

for (var i = 0, len = departments.length; i < len; i++) {
    department = departments[i]; // department
    for (var key in department) {
        if (key !== 'data' && department.data) {
            department.data[key] = department[key];
        }
    }
    departments[i] = department.data || department; // if no department.data, no change
}

console.log(departments);

结果:

这里输入图片描述

查看完整演示 http://jsfiddle.net/KVYE5/


我本来也要回答这个问题,但Wiky更快,所以+1 :) - risyasin
然而,在departments中有几个obj - ilhan
在演示代码中,objdepartments 的一个项目,你只需要循环遍历“departments”,其他都是相同的。 - wiky

2

我写了一个小的npm包,可以实现您所要求的功能:将对象中的属性提升到更高一级。

您可以在此处获取它:https://www.npmjs.com/package/move-property-up-a-level

使用方法

var movePropertyUpALevel = require('movePropertyUpALevel');

var fakeObj = {
    poodle: {
        first: {
            hey: 'you'
        },
        second: 'meAgain'
    }
};

movePropertyUpALevel(fakeObj, 'poodle');

console.log(fakeObj.first.hey);
//'you'
console.log(fakeObj.poodle);
//undefined

"Useage" 拼写错误。 - Jack Fairfield

1
obj =
[
    {"field"    : "DEPARTMAN_NO",
     "data"     : { "type":"numeric" , "comparison":"eq" , "value":11 }
    },
    {"field"    : "DEPARTMAN_ADI",
     "data"     : { "type":"string" , "value":"bir" }
    }
];


for ( var item in obj ) {
    if ( obj[item].field && obj[item].data ) { //check the 'field' and 'data' exist
        obj[item].field = {
            dept : obj[item].field ,         //department name is put into a property
            type : obj[item].data.type,      //so is data.type and data.value..
            value: obj[item].data.value      //..all are now contained in 'field'
        };
        delete obj[item].data;               //remove the 'data' object
    }
}

console.log(obj);

0
department.type = department.data.type;
department.value = department.data.value;
delete department['data'];

我认为我需要循环,因为它说department.data.type未定义。 - ilhan
1
departement.data 是否已定义?您能否给我们更全面的对象树视图? - Denys Séguret
我认为 JavaScript 引擎不理解我所指的对象,因为 departement 中有两个对象。因此,更合适的写法可能是 departement.[0].data - ilhan
可能。这是一个有效的语法。不知道整个对象树,很难说它是否合适。 - Denys Séguret
departement.data 未被定义。我已经更新了问题。 - ilhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接