如何从给定对象中以指定方式获取构造对象 [英] how to get construct object in specified manner from given object

查看:64
本文介绍了如何从给定对象中以指定方式获取构造对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在构造所需格式的object时遇到问题.

i have problem in constructing a object in desired format.

我想以这种方式获取对象

i want to get the object in this manner

{"pendrive":['went to each object and picked "TEST_HOME" value'],"minichip":['went to each object and picked "TEST_PROXY" value']}

必须从每个object中收集上述array的值,方法是转到mount_status然后是key,例如示例 TEST_PROXYTEST_HOMETEST_ARCHIVETEST_TARGET

the value of the above array must be collected from each object by going to mount_status then key , for example TEST_PROXY,TEST_HOME,TEST_ARCHIVE,TEST_TARGET

所需的输出: {"pendrive":["error","na","error","ok","na","na"]}"TEST_HOME" ,其他键相同

这是我尝试过的事情:

  var nodeSum = {};
var nodeStatus = {
  "node_stats": {
    "pendrive": {
      "mount_status": {
        "TEST_PROXY": "error",
        "TEST_TARGET": "error",
        "TEST_ARCHIVE": "error",
        "TEST_HOME": "error"
      }
    },
    "minichip": {
      "mount_status": {
        "TEST_PROXY": "na",
        "TEST_TARGET": "na",
        "TEST_ARCHIVE": "na",
        "TEST_HOME": "na"
      }
    },
    "simcard": {
      "mount_status": {
        "TEST_HOME": "error",
        "TEST_TARGET": "error",
        "TEST_ARCHIVE": "error",
        "TEST_PROXY": "error"
      }
    },
    "hostname": [
      "nikola",
      "goldplus",
      "pendrive",
      "simcard",
      "airtel",
      "minichip",
      "voda"
    ],
    "airtel": {
      "mount_status": {
        "TEST_PROXY": "ok",
        "TEST_TARGET": "ok",
        "TEST_ARCHIVE": "ok",
        "TEST_HOME": "ok"
      }
    },
    "voda": {
      "mount_status": {
        "TEST_HOME": "na",
        "TEST_TARGET": "na",
        "TEST_ARCHIVE": "na",
        "TEST_PROXY": "na"
      }
    },
    "nikola": {
      "mount_status": {
        "TEST_HOME": "na",
        "TEST_ARCHIVE": "na",
        "TEST_TARGET": "na",
        "TEST_PROXY": "na"
      }
    }
  }
}


console.log(nodeStatus);

var hostNames = nodeStatus["node_stats"]["hostname"];

for(var i = 0; i<hostNames.length;i++){

  if(nodeStatus["node_stats"][hostNames[i]]){
    eachNode = nodeStatus["node_stats"][hostNames[i]];
    console.log(eachNode);
  }
  //nodeSum[hostNames[i]] = eachNode["mount_status"][Object.keys(eachNode["mount_status"])];
  if(eachNode){
    if(eachNode.hasOwnProperty("mount_status")){
      if(i <= 1)
        var allBins = Object.keys(eachNode["mount_status"]);
        console.log('all keys',allBins);
        console.log(nodeStatus["node_stats"][hostNames[i]][allBins[i]]);
        console.log(Object.values(eachNode["mount_status"]));

        var binStatusArray = Object.values(eachNode["mount_status"]);
        nodeSum[allBins[i]] = eachNode["mount_status"][allBins[i]];
      }
    }         
  }
  console.log('results',nodeSum);
}

推荐答案

您可以为每种类型的项目和属性名称使用对象查找.然后使用Object.keys()遍历查找的每个键,并使用array#reduce遍历每个键与对应于lookup属性的所有值,并使用每个对象的所有值的array#reduce创建一个数组.

You can use an object lookup for each type of item and property name. Then Using Object.keys() iterate through each key of lookup and array#reduce each key with all the values corresponding to lookup property and create an array using array#reduce of all the values of each object.

var nodeStatus = { "node_stats": { "pendrive": { "mount_status": { "TEST_PROXY": "error", "TEST_TARGET": "error", "TEST_ARCHIVE": "error", "TEST_HOME": "error" } }, "minichip": { "mount_status": { "TEST_PROXY": "na", "TEST_TARGET": "na", "TEST_ARCHIVE":"na", "TEST_HOME": "na" } }, "simcard": { "mount_status":{ "TEST_HOME": "error", "TEST_TARGET": "error", "TEST_ARCHIVE": "error", "TEST_PROXY": "error" } }, "hostname": [ "nikola", "goldplus", "pendrive", "simcard", "airtel", "minichip", "voda" ], "airtel":{ "mount_status": { "TEST_PROXY": "ok", "TEST_TARGET": "ok", "TEST_ARCHIVE": "ok", "TEST_HOME": "ok" } }, "voda": { "mount_status": { "TEST_HOME": "na", "TEST_TARGET": "na", "TEST_ARCHIVE": "na", "TEST_PROXY": "na" } }, "nikola": { "mount_status": { "TEST_HOME":"na", "TEST_ARCHIVE": "na", "TEST_TARGET": "na", "TEST_PROXY": "na" } } } },
    lookup = {pendrive: 'TEST_HOME', minichip: 'TEST_PROXY'}
    result = Object.keys(lookup).reduce((o,k) => {
      o[k] =  Object.keys(nodeStatus.node_stats).reduce((r,key) => {
      if('mount_status' in nodeStatus.node_stats[key])
          r.push(nodeStatus.node_stats[key].mount_status[lookup[k]]);
      return r;
    },[]);
    return o;
   },{});
console.log(result);

这篇关于如何从给定对象中以指定方式获取构造对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆