簡體   English   中英

在 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數據,但保留datelisted_namename等...?

使用["_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]}));
}

請參閱One-liner 從 ES 6 中的 object 獲取一些屬性 該問題還提供了一些非 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"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM