我有以下对象:
var result = [{
"id": 89304,
"employeeDetails": {
"id": 102524,
"version": 9
}
}];
这是我试图推入MySQL表的更大对象的片段。 我想要实现的只是将值提取到它们自己的数组中,这将返回:
[ '89304', '102524', '9' ]
这样,我可以轻松地将值推送到数据库。
我尝试过以下操作,无需嵌套就可以正常工作:
obKeys = Object.keys(result);
console.log(obKeys);
然而,通过嵌套,我得到的结果如下:
[ '0' ]
任何人都可以让我知道我哪里出错了,或者建议一种替代(更好)的方法吗?
感谢。
答案 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 -
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;
答案 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)
一个辅助功能:
.flatten()
,将数组从多维展平为仅一个检索值的两种不同方法:
.search()
,检索与某个键匹配的所有值
.scalars()
,检索所有标量值
注意: 对内置对象进行原型设计通常是一个坏主意。以下是为了区分(数组与对象关联)以及可读性和简单性而完成的,但是注意了这个警告。
(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;
这两个例子都是递归调用。一种方法评估密钥,当它等于搜索关键字时返回值。另一种方法评估类型,如果它不是一个对象(它是一个标量),则返回一个值。
由于使用了map()
,因此可能会有undefined
个值。这就是调用filter()
的原因,以便过滤掉这些值。搜索函数返回的是一个数组(可能是一个数组的数组),这就是调用flatten()
的原因,以确保它是一个单维数组。
答案 8 :(得分:0)
一些观察结果:
<强>样本强>
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);