展平嵌套的json并获取对象键

时间:2016-01-06 13:21:03

标签: javascript json underscore.js

我从客户端获取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

的链接

2 个答案:

答案 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']

编辑1

已将=== 'and'=== 'or'迁移到数组exceptionList。您可以添加需要过滤的其他键。这样可以保持过滤的可管理性和条件清洁。

代码

JSFiddle



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)