按JavaScript

时间:2015-05-28 02:01:58

标签: 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",
        "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"]

5 个答案:

答案 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"]