我从客户端获取json是嵌套的,我想对它进行操作并使子对象键,最好使用underscore.js。
例如,这是我的json:
var data = {
or:[
{
dealershipCompany : 11
},
{
authType: 'google'
}],
and: [
{
or: [
{
firstName: {'contains': 'search'}
},
{
lastName: {'contains': 'search'}
},
{
email: {'contains': 'search'}
}]
}]
};
我想删除'或'& '和'
当我使用Object.keys(数据)获取对象键时,我得到了
['0','1','2','3','4','5']
但我希望它像这样
['dealershipCompany', 'authType', 'firstName', 'lastName','email']
我试过几次自己压扁它,但是对象键总是被编号
此处为jsFiddle
的链接答案 0 :(得分:3)
这应该有效:
var data = {
or:[
{ dealershipCompany : 11 },
{ authType: 'google' }
],
and: [ {
or: [
{ firstName: {'contains': 'search'} },
{ lastName: {'contains': 'search'} },
{ email: {'contains': 'search'} }
]
}]
};
function getOnlyObjects(data) {
var result = [];
if (Array.isArray(data)) {
data.forEach(function(item) {
result = result.concat(
getOnlyObjects(item)
);
});
}
else {
Object.keys(data).forEach(function(key) {
if (Array.isArray(data[key])) {
result = result.concat(
getOnlyObjects(data[key])
);
}
else {
result = result.concat(data);
}
});
}
return result;
}
function getData(data) {
return getOnlyObjects(data).map(function(item) {
return Object.keys(item)[0];
});
}
console.log(getData(data));
输出:
["dealershipCompany", "authType", "firstName", "lastName", "email"]
答案 1 :(得分:1)
当您对数组使用Object.keys
时,您将获得索引,因此您获得了['0','1','2','3','4','5']
。
已将=== 'and'
,=== 'or'
迁移到数组exceptionList
。您可以添加需要过滤的其他键。这样可以保持过滤的可管理性和条件清洁。
var data = {
or: [{
dealershipCompany: 11
}, {
authType: 'google'
}],
and: [{
or: [{
firstName: {
'contains': 'search'
}
}, {
lastName: {
'contains': 'search'
}
}, {
email: {
'contains': 'search'
}
}, ]
}]
};
var result = [];
// You can add further keys that you want to filter
var exceptionList = ["and", "or"];
function getKeys(obj) {
var _keys = Object.keys(obj);
_keys.forEach(function(key) {
// Check if key is either,`and`, `or`, or an index of array.
if (exceptionList.indexOf(key) >=0 || !isNaN(key)) {
getKeys(obj[key]);
} else {
result.push(key);
}
});
}
getKeys(data);
console.log(result)