在JavaScript中按属性过滤JSON数据
Filter JSON data by property in JavaScript
我有一个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
, listed_name
, name
等?
使用["_id"]
数组作为过滤器,预期的控制台输出应该如下所示:
person1
person2
person3
假设传入的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]])
}
}
如果你定义了一个小的辅助函数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]}));
}
参见一行代码从es6中的对象中获取一些属性。这个问题也提供了一些非es6的选项,比如
function pick(o, fields) {
return fields.reduce(function(result, field) {
result[field] = o[field];
return result;
}, {});
}
我将对数组进行反序列化,然后对结果使用.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
变量中给出了现在过滤的对象数组。
谢谢大家的帮助,但我想出了一个解决方案。可能不是最有效的…不知道……但它是有效的。以下是完整的代码:
$.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
如果您愿意使用库,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"]
相关文章:
- 在单击时过滤 JSON
- 如何用javascript过滤JSON数据
- 如何使用 AngularJs 过滤 JSON 数据
- 使用Angular js ng repeat指令过滤json对象
- 使用AngularJS过滤JSON数据
- 如何根据“架构”过滤 JSON 对象
- 使用 ng-repeat 过滤 JSON API
- 根据最小和最高价格过滤 JSON 数据
- 使用 javascript 过滤 JSON 数组
- 使用 Javascript 过滤 json 字符串
- 使用 JavaScript 过滤 Json
- 在angular js中过滤json或服务器中的数据
- 过滤 JSON 以获取 JavaScript 中的特定值
- 如何使用Ember.Select值来过滤JSON
- 无法仅通过名称过滤json数据
- 使用AngularJS过滤JSON数据,并使用智能表使用ng repeat登记
- 用javascript对象过滤json
- 如何通过按钮数据属性过滤JSON文件
- 如何使用关键字过滤JSON数组对象
- 通过javascript的字符串过滤json字段