Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提取Javascript对象中的嵌套值_Javascript_Arrays_Object - Fatal编程技术网

提取Javascript对象中的嵌套值

提取Javascript对象中的嵌套值,javascript,arrays,object,Javascript,Arrays,Object,我的目标如下: var result = [{ "id": 89304, "employeeDetails": { "id": 102524, "version": 9 } }]; 这是一个较大对象的片段,我正试图将它推送到MySQL表中。 我试图实现的是将值提取到它们自己的数组中,该数组将返回以下内容: [ '89304', '102524', '9' ] 这样,我可以轻松地将值推送到DB 我尝试了以下操作,无需嵌套即可正常工作: obKeys=Object.keysres

我的目标如下:

var result = [{
"id": 89304,
"employeeDetails": {
    "id": 102524,
    "version": 9
}
}];
这是一个较大对象的片段,我正试图将它推送到MySQL表中。 我试图实现的是将值提取到它们自己的数组中,该数组将返回以下内容:

[ '89304', '102524', '9' ]
这样,我可以轻松地将值推送到DB

我尝试了以下操作,无需嵌套即可正常工作:

obKeys=Object.keysresult; console.logobKeys

但是,通过嵌套,我得到的结果如下:

['0']

有人能告诉我哪里出了问题,或者建议一种更好的方法吗


谢谢。

您可以编写一个递归函数,以列表形式返回值。只需使用forEach遍历键,如果值是对象,则调用自身

从结果列表中获取数据,并逐个输入myList。 @吉姆·多佛试试这个

 var myList;
    myList.push(result[0].id);
    myList.push(result[0].employeeDetails.id);
    myList.push(result[0].employeeDetails.version);
或者干脆

    result.forEach(function(item,index) {
var TempList;
        TempList.push(item.id);
            TempList.push(item.employeeDetails.id);
            TempList.push(item.employeeDetails.version);

    myList.push(TempList);
    });

这是因为“result”实际上是一个数组,所以输出的键是数组中整个对象的键

要从对象中提取值,首先必须遍历数组,然后针对每个项遍历keys object.keysobj

这里有一个粗略的例子,希望对你有所帮助

var result = [{
"id": 89304,
"employeeDetails": {
    "id": 102524,
    "version": 9
}
}];


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

  var item = result[i];

  Object.keys(item).forEach(function(key) {

    console.log(item[key]); // This will provide you the value for each key.

  });

}
由于对象中的一个属性也是and对象,因此您必须检查该属性,然后进一步对其进行迭代。

只需在结果数组中循环,就可以了

var结果=[ { 身份证号码:89304, 雇员详情:{ 身份证号码:102524, 版本:9 } }, { 身份证号码:89123, 雇员详情:{ 身份证号码:102456, 版本:18 } } ]; var arr1=result.mapfunctionitem{ return[item.id,item.employeeDetails.id,item.employeeDetails.version]; }; /*ES6语法*/ 让arr2=result.mapitem=>[item.id,item.employeeDetails.id,item.employeeDetails.version]; console.logarr1;
console.logarr2 结果本身就是一个数组,其中的键默认为0,1,2,所以得到的是0

这就是你想要的

var result = [{
  "id": 89304,
  "employeeDetails": {
    "id": 102524,
    "version": 9
  }
}];

var finalresult = [];
result.forEach(function(record) {
  console.log(getObjValue(record));
})


function getObjValue(obj) {
  var keys = Object.keys(obj);
  for (i = 0; i < keys.length; i++) {
    if (typeof obj[keys[i]] == 'object') {
      getObjValue(obj[keys[i]]);
    } else {
      finalresult.push(obj[keys[i]])
    }
  }
  return finalresult
}

对于任何嵌套的JSON,请尝试此操作-

var结果=[{ 身份证号码:89304, 雇员详情:{ 身份证号码:102524, 版本:9, 地址:{ 国家:美国, 城市:洛杉矶 } } }]; 函数get_itobj{ obj中的forvar prop{ IftypeofOBJ[prop]=“对象”{ //反对 获得[道具]; }否则{ //别的 console.logobj[prop]+'; } } } 得到结果; multiArr将包含数组的数组。我希望这有帮助。

通过 安装程序 一个辅助功能:

.展平,将阵列从多维展平到仅一个维度 检索值的两种不同方法:

.search,检索与某个键匹配的所有值

.标量,检索所有标量值

注意:对内置对象进行原型化通常不是一个好主意。为了区分数组与对象关联,以及为了可读性和简单性,下面将进行此操作,但请注意此警告

实例 作用{ 严格使用; //制作多维数组,一维 Array.prototype.flatte=函数{ 返回this.reduceac,val=>{ 根据concat返回 Array.isArrayval?val.flatte:val }, []; }; //迭代键和值 //如果不是对象,则返回与搜索键匹配的值 Object.prototype.search=functionsearch\u键{ var obj=这个; var vals=Object.keysobj.mapkey=>{ 如果对象[键]的类型=='object'&&obj[键]!==null 返回obj[key].searchsearch\u键; 否则,如果搜索键===键 返回obj[键]; }; 返回vals.filterval=>val!==未定义; }; //迭代键和值 //返回标量 Object.prototype.scalars=函数{ var obj=这个; var vals=Object.keysobj.reduceac,key=>{ 如果对象的类型[键]!==“对象” acc[acc.length]=obj[key]; 否则,如果obj[键]!==null acc[acc.length]=obj[key]。标量; 返回acc; }, []; 返回vals.filterval=>val!==未定义; }; //数据集 var结果=[{ 身份证号码:89304, 雇员详情:{ 身份证号码:102524, 版本:9 } }]; //测试1:键的值 console.log 对象搜索“id”:, result.mapobj=>{ 返回obj.search'id' }.压扁 ; //测试2:所有标量值 console.log 对象标量:, result.mapobj=>{ 返回对象标量 }.压扁 ; }; 一些意见:

您正在获取['0'],因为您正在对数组而不是对象调用Object.keys。 Object.keys将返回键而不是值。 正如前面所说的,JavaScript不能保证对象属性的顺序,因此结果数组的顺序也不能保证 演示

使用数组方法。 var结果=[{ 身份证号码:89304, 雇员详情:{ 身份证号码:102524, 版本:9 } }]; var-arr=[]; result.mapfunctionitem{ 啊 .pushitem.id、item.employeeDetails.id、item.employeeDetails.version; };
console.logarr;1您正在调用数组而不是对象上的Object.keys。2如果它是一个对象,object.keys将返回键而不是值。3 JavaScript无法保证对象属性的顺序,因此结果数组的顺序也无法保证。实际上,您有一个对象数组,在示例中是一个对象数组。较大对象的实际结构是什么?@Jim Dover试试看,这可能有帮助+1如果数据结构和键不变,这很好。它不是最健壮的,但是如果数据结构是静态的,它就不一定是最健壮的。它也是最干净、最易管理的,这意味着很多。
var multiArr =[];
var arr = [];
function deepTraverse(obj) {
    if( typeof obj == "object" ) {
        $.each(obj, function(k,v) {
           deepTraverse(v);
        });
    }
    else {
        arr.push(obj);
    }
}

$.each(result,function(k,v){
deepTraverse(v);
multiArr.push(arr);
arr = [];
});

console.log(multiArr);