在JavaScript中按属性过滤JSON数据

Filter JSON data by property in JavaScript

本文关键字:过滤 JSON 数据 属性 JavaScript      更新时间:2023-09-26

我有一个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"]