javascript - 如何从给定对象以指定方式获取构造对象

标签 javascript jquery node.js

我在以所需格式构造对象时遇到问题。

我想以这种方式获取对象

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

必须通过先转到 mount_status 然后转到 key 从每个对象收集上述数组的值,对于示例 TEST_PROXYTEST_HOMETEST_ARCHIVETEST_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 每个键以及与查找属性对应的所有值,并使用 array 创建一个数组#reduce 每个对象的所有值。

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);

关于javascript - 如何从给定对象以指定方式获取构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49284869/

相关文章:

javascript - Cron 工作每天上午 9 点到下午 5 点

javascript - 单击按钮没有响应

javascript - 使用jquery隐藏div内的内容元素

jquery - 我如何使用 jquery 来增加单击的特定 div 的大小。我使用循环创建了 div

javascript - jQueryUI Sortable - 取消属性使无法编辑输入

android - 使用 Node.JS 服务器验证 Android 应用程序检索到的 Google 访问 token

javascript - Promise.race 在第一次履行后是否会拒绝其他 promise ?

javascript - 显示对象内容 - JS/jQuery

node.js - 如何为图像中的文本添加阴影?

node.js - Sequelize : Error creating a post and associating it with the current user