在JavaScript中按属性筛选JSON数据
我有一个JSON序列化的集合:在JavaScript中按属性筛选JSON数据,javascript,arrays,json,Javascript,Arrays,Json,我有一个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",
[
{
"_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,如何使用第二个数组作为过滤器,仅返回第二个数组中包含的列
例如:使用这个数组[“\u id”]
。。。如何使用此数组仅显示所有JSON对象的\u id
数据,而不显示日期
,列出的名称
,名称
,等等
使用[“\u id”]
数组作为过滤器,预期的控制台输出应如下所示:
person1
person2
person3
我将对数组进行反序列化,然后在结果上和映射函数内对标识符数组中要保留的每个项进行循环,将它们复制到一个新对象,并从映射中返回。所以在伪代码中:
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]);
}
});
假设在变量中包含传入的JSON var parsedJSON=JSON.parse(inputJSON) 变量filterary=[“\u id”,“date”] 对于(变量i=0;i
pick
(或使用下划线的\uu.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替代方案,例如
function pick(o, fields) {
return fields.reduce(function(result, field) {
result[field] = o[field];
return result;
}, {});
}
如果你愿意使用一个库,这就很简单:
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是一组独立于平台的序列化数据;由于您没有标记语言,我会问——您要将JSON数据反序列化为哪种语言,并尝试您所问的操作?到目前为止,您尝试过什么吗?请给我们看看你试过的代码。我试过很多不同的方法。但是给我一点时间回去看看。我应该把尝试的代码放在这里吗?或者在主要问题中?您至少应该展示一个预期输出的示例。你的解释很有帮助,但举个例子就能说明问题。
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"]