我有一个JSON序列化集合:
[
{
"_id":"person1",
"date":"7/20/2014 17:20:09",
"listed_name":"Tom",
"name":"Tom",
"contact_info":"tom@gmail.com"
},
{
"_id":"person2",
"date":"7/20/2014 17:20:09",
"listed_name":"Jane",
"name":"Jane",
"contact_info":"Person2@gmail.com"
},
{
"_id":"person3",
"date":"7/20/2014 17:20:09",
"listed_name":"John",
"name":"John",
"contact_info":"Person3@gmail.com"
}
]
来自其他页面的属性名称信息......
["_id", "date", "listed_name"]
问题是......
使用JavaScript,我如何使用第二个数组作为过滤器来仅返回第二个数组中包含的列?
例如:使用此数组["_id"]
...如何使用此数组仅显示所有JSON对象的_id
数据但保持date
,{{1} },listed_name
等......?
使用name
数组作为过滤器,预期的控制台输出应如下所示:
["_id"]
答案 0 :(得分:2)
假设你有一个可以接受的传入JSON ......
var parsedJSON = JSON.parse(inputJSON)
var filterArray = ["_id","date"]
for(var i = 0;i< parsedJSON.length;++i){
for(var filterItem in filterArray){
console.log(parsedJSON[i][filterArray[filterItem]])
}
}
答案 1 :(得分:1)
如果定义一个名为pick
的小助手函数(或使用下划线的_.pick
)从对象中选择指定的属性,那么在ES6中它只是
input . map(element = > pick(element, fields))
在英语中,使用与上述代码相关联的粗体字:
将输入和地图中的每个元素带到选择的结果元素某些指定的字段。
或使用数组理解
[ for (elt of input) pick(elt, fields) ]
或在ES5中
input . map(function(elt) { return pick(elt, fields); })
你怎么写pick
?如果你在ES6写作,那么
function pick(o, fields) {
return Object.assign({}, ...(for (p of fields) {[p]: o[p]}));
}
见One-liner to take some properties from object in ES 6。该问题还提供了一些非ES6替代方案,例如
function pick(o, fields) {
return fields.reduce(function(result, field) {
result[field] = o[field];
return result;
}, {});
}
答案 2 :(得分:0)
我会对数组进行反序列化,然后对结果使用.map
,并在map函数循环中使用要保留的标识符数组中的每个项目,将它们复制到新对象,然后返回来自地图。所以在伪代码中:
var filters = [/* our array of identifiers to keep */];
var filtered = JSON.parse(unfiltered).map(function(currObj) {
var temp = {};
for identifier in filters:
temp[identifier] = currObj[identifier];
return temp;
});
这将为您提供filtered
变量中现已过滤的对象数组。
答案 3 :(得分:0)
感谢大家的帮助,但我想出了一个解决方案。可能不是最有效的......不知道......但是它有效。这是完整的代码。
$.getJSON( '/jsonData', function(data) {
//Put JSON list data into variable.
listData = data;
//Get external query array.
var parsedArray = JSON.parse([storedArray]); //console output:["_id", "date", "listed_name"]
//Loop through parsedArray to get filters.
for(var i=0;i<parsedArray.length;i++){
//Put array items into variable.
queryKeys = parsedArray[i];
//Loop through all JSON data.
for(var x=0;x<ListData.length;x++){
//filter output by queryKeys variable.
console.log(makerListData[x][queryKeys]);
}
});
控制台输出:
person1
person2
person3
7/20/2014 17:20:09
7/20/2014 17:20:09
7/20/2014 17:20:09
Tom
Jane
John
答案 4 :(得分:0)
如果您愿意使用图书馆,lodash会使这一点变得微不足道:
function pick(collection, attributes) {
return _(attributes)
.map(function(attr) { return _.pluck(collection, attr); })
.flatten()
.value();
}
示例:
pick(data, ['_id']);
// -> ["person1", "person2", "person3"]
pick(data, ['_id', 'date', 'listed_name']);
// -> ["person1", "person2", "person3", "7/20/2014 17:20:09", "7/20/2014 17:20:09", "7/20/2014 17:20:09", "Tom", "Jane", "John"]