在Javascript对象中提取嵌套值

时间:2017-03-30 03:54:54

标签: javascript arrays object

我有以下对象:

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

这是我试图推入MySQL表的更大对象的片段。 我想要实现的只是将值提取到它们自己的数组中,这将返回:

[ '89304', '102524', '9' ]

这样,我可以轻松地将值推送到数据库。

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

obKeys = Object.keys(result); console.log(obKeys);

然而,通过嵌套,我得到的结果如下:

[ '0' ]

任何人都可以让我知道我哪里出错了,或者建议一种替代(更好)的方法吗?

感谢。

9 个答案:

答案 0 :(得分:2)

只需循环遍历results数组,这应该可以解决问题。



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

var arr1 = result.map(function(item){
    return [item.id, item.employeeDetails.id, item.employeeDetails.version];
});


/* ES6 Syntax */
let arr2 = result.map((item) => [item.id, item.employeeDetails.id, item.employeeDetails.version]);

console.log(arr1);
console.log(arr2);




答案 1 :(得分:1)

您可以编写递归函数,将值作为列表返回。只需使用forEach遍历键,如果value是对象调用本身。

答案 2 :(得分:1)

从结果列表中获取数据并逐个获取到myList。 @Jim Dover试试这个

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

答案 3 :(得分:1)

这是因为'result'实际上是一个Array,因此输出的键是数组中WHOLE对象的键。

要从对象中提取值,首先必须迭代数组,然后对每个项目进行迭代,然后迭代键(Object.keys(obj))。

这是一个粗略的例子供你工作,希望它有所帮助。

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.

  });

}

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

答案 4 :(得分:1)

结果本身是一个数组,默认情况下,键是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
}

答案 5 :(得分:1)

尝试使用任何嵌套的JSON -

&#13;
&#13;
var result = [{
"id": 89304,
"employeeDetails": {
    "id": 102524,
    "version": 9,
    "Address": { 
          "Country": "US",
          "City": "LA"
  }
}
}];

function get_it(obj){
    for(var prop in obj){
        if(typeof obj[prop]=='object'){
            // object
            get_it(obj[prop]);
        }else{
            // something else
            console.log(obj[prop]+'.');
        }
    }
}

get_it(result);
&#13;
&#13;
&#13;

答案 6 :(得分: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);

multiArr将包含数组数组。我希望这会有所帮助。

答案 7 :(得分:1)

按&lt;检索值键/类型&gt;

设置

  • 一个辅助功能:

    1. .flatten(),将数组从多维展平为仅一个
  • 检索值的两种不同方法:

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

    2. .scalars(),检索所有标量值

注意: 对内置对象进行原型设计通常是一个坏主意。以下是为了区分(数组与对象关联)以及可读性和简单性而完成的,但是注意了这个警告。

实施例

&#13;
&#13;
(function() {
  "use strict";

  // Makes multi-dimensional array, one-dimensional
  Array.prototype.flatten = function() {
    return this.reduce((acc, val) => {
      return acc.concat(
        Array.isArray(val) ? val.flatten() : val
      )
    }, []);
  };

  // Iterate over keys and values
  // Return value that matches search_key if not an object
  Object.prototype.search = function(search_key) {
    var obj = this;

    var vals = Object.keys(obj).map(key => {
      if (typeof obj[key] === 'object' && obj[key] !== null)
        return obj[key].search(search_key);
      else if (search_key === key)
        return obj[key];
    });
    return vals.filter(val => (val !== undefined));
  };

  // Iterate over keys and values
  // Return scalars
  Object.prototype.scalars = function() {
    var obj = this;

    var vals = Object.keys(obj).reduce((acc, key) => {
      if (typeof obj[key] !== 'object')
        acc[acc.length] = obj[key];
      else if (obj[key] !== null)
        acc[acc.length] = obj[key].scalars();
      return acc;
    }, []);
    return vals.filter(val => (val !== undefined));
  };


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


  // Test 1: values of a key
  console.log(
    "obj.search('id'):",
    result.map(obj => {
      return obj.search('id')
    }).flatten()
  );

  // Test 2: all scalar values
  console.log(
    "obj.scalars():",
    result.map(obj => {
      return obj.scalars()
    }).flatten()
  );

}());
&#13;
&#13;
&#13;

说明

这两个例子都是递归调用。一种方法评估密钥,当它等于搜索关键字时返回值。另一种方法评估类型,如果它不是一个对象(它是一个标量),则返回一个值。

由于使用了map(),因此可能会有undefined个值。这就是调用filter()的原因,以便过滤掉这些值。搜索函数返回的是一个数组(可能是一个数组的数组),这就是调用flatten()的原因,以确保它是一个单维数组。

答案 8 :(得分:0)

一些观察结果:

  • 你得到['0'],因为你在数组而不是对象上调用Object.keys()。
  • Object.keys()将返回键而非值。
  • 由于Robby表示在JavaScript中无法保证对象属性的顺序,因此结果数组的顺序也不是

<强>样本

  • 使用数组map()方法。

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

var arr = [];
result.map(function(item) {
    arr.push(item.id, item.employeeDetails.id, item.employeeDetails.version);
});

console.log(arr);

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

var arr = [];
for (var i in result) {
  arr.push(result[i].id, result[i].employeeDetails.id, result[i].employeeDetails.version);
}

console.log(arr);