javascript-从json对象提取数组
假设我们有以下json对象:javascript-从json对象提取数组,javascript,arrays,json,performance,algorithm,Javascript,Arrays,Json,Performance,Algorithm,假设我们有以下json对象: [{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"}, {"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"}, .... {"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}] 我们如何从这个只有X2个键值对的对象数组中检索 意思是,以下结果: [ {"a2" : "a2Val"}, {"b2" : "b2Val"},
[{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"},
{"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"},
....
{"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}]
我们如何从这个只有X2个键值对的对象数组中检索
意思是,以下结果:
[ {"a2" : "a2Val"}, {"b2" : "b2Val"}, ... ,{ "z2" : "z2Val"}]
在最佳性能范围内
密钥不必包含数字
这里我需要的是一个函数,它将接收参数-I
并返回原始json对象中所有第i个对象的数组
例如,如果我们看一下上面的json对象
我们调用方法2,该方法将返回
[ {"a2" : "a2Val"}, {"b2" : "b2Val"}, ... ,{ "z2" : "z2Val"}]
希望它足够清晰。在阵列上执行forEach循环。然后为每个值获取带有正则表达式的键。().
我不会给你完整的代码,因为它很容易实现,而且是一个很好的学习体验。转换到数组,映射键,过滤结果,等等。 这应该适合您:
var result = arr
.map(function (obj) {
return Object.keys(obj).map(function (key) {
var result = {};
result[key] = obj[key];
if (key.substring(1) === "2") {
return result;
}
});
})
.reduce(function (x, y) { return x.concat(y); }, [])
.filter(function (obj) { return obj });
.您可以在此处使用
Array.map
var arr = oldArr.map(function(obj){
var key = Object.keys(obj).sort()[1], rtn = {};
return rtn[key] = obj[key], rtn;
});
您要做的是获取第二个键,然后返回一个具有该键和值的新对象。这是一种非常奇妙的方法,可以完全按照您的要求执行。只要稍加调整,任何东西都适用
var json = '[{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"},{"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"},{"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}]',
parsed = JSON.parse(json),
index = 2, // here goes your value
result = parsed.map(function(obj){
var key = Object.keys(obj)[0][0]+index,
retDict = {};
return retDict[key] = obj[key], retDict;
});
在控制台中运行此命令,然后查看。关于此命令:
var collection, key, obj, objArr, _i, _len, _tmp;
collection = [
{
"a1": "a1Val",
"a2": "a2Val",
"a3": "a3Val"
}, {
"b1": "b1Val",
"b2": "b2Val",
"b3": "b3Val"
}
];
objArr = [];
for (_i = 0, _len = collection.length; _i < _len; _i++) {
obj = collection[_i];
for (key in obj) {
_tmp = {};
_tmp[key] = obj[key];
objArr.push(_tmp);
}
}
var集合、key、obj、objArr、i、len、tmp;
集合=[
{
“a1”:“a1Val”,
“a2”:“a2Val”,
“a3”:“a3Val”
}, {
“b1”:“b1Val”,
“b2”:“b2Val”,
“b3”:“b3Val”
}
];
objArr=[];
对于(_i=0,_len=collection.length;_i<_len;_i++){
obj=收集[_i];
用于(输入obj){
_tmp={};
_tmp[key]=obj[key];
目标推力(tmp);
}
}
您可能会发现,在使用恢复器函数解析JSON字符串时,这样做效率更高。像这样的
var json='[{“a1”:“a1Val”,“a2”:“a2Val”,“a3”:“a3Val”},{“b1”:“b1Val”,“b2”:“b2Val”,“b3”:“b3Val”},{“z1”:“z1Val”,“z2”:“z2Val”,“z3”:“z3Val”},
data=JSON.parse(JSON,函数(键,值){
if(key!==“”&&typeof值==='object'){
Object.keys(值).forEach(函数(名称){
if(name.slice(-1)!='2'){
删除值[名称];
}
});
}
返回值;
});
document.body.appendChild(document.createTextNode(JSON.stringify(data))代码>
在这个resArr中,我将它映射到initialArr[],从中生成一个名为resArr的数组,每个元素initialArr表示为“x”,在这个x中,x现在是一个对象,以获取对象x[1]的第二个元素,所以这里,1表示第二个元素,因为索引从0,1、、开始,,,因此,我们需要通过object.keys(x)[1]…来获取该对象的键。因此,值将是x[object.keys(x)[1]。您的结果不是有效数组。您想要一个对象({“a2”:“a2Val”,“b2”:“b2Val”…}
);对象数组([{“a2”:“a2Val”}、{“b2”:“b2Val”}……]
)或其他什么?这是数据的实际格式吗?你会一直有a到z吗?我想你的意思是你想要一本只有指定对的字典?问题是字典没有排序。这些键真的包含数字吗?@Paul Roub,我想要一个对象数组。。我会更新的question@SanjayManohar,键不必包含数字..与您的想法相同,但您的解决方案更为奇特。该死,我喜欢你在返回声明中使用,
的方式@Qwerty啊!您是第一个了解逗号运算符用法的人。谢谢:)@AmitJoki,谢谢,这是我看到的最优雅的方式。我会用你的方式@约翰史密斯很高兴能帮助你:)我也想得到这个答案!请添加一个更详细的解释-很好,但直接在你的答案上,而不是在评论上。
var initialArr = [
{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"},
{"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"},
{"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}
];
var resArr = initialArr.map(function(x){
return x[Object.keys(x)[1]];
});