如何从javacsript中的现有JSON对象获取特定的键值?

时间:2019-09-16 11:04:03

标签: javascript json

我有一个JSON对象,我想创建具有特定键值的JSON子集。

JSON对象

{
    "Checksum": "OK",
    "ID": "012B4567",
    "DOB: "12-12-1991"
    "Data": "Test Line 1 >>>>>↵Test Line 2 >>>>>↵Test Line 3 >>>>>",
    "issue: "11-April-2015",
    "DocID": "PASSPORT",
    "Number: "123456789",
    "Document": "PASSPORT",
    "Photo": "Qk06AAAAAAAAA",
    "ExpiredFlag": false,
    "ExpiryDate": "01 Apr 12",
    "Forename": "IMA Phoney",
    "Image2": "/9j/4AAQSkZJRgABAQEBkAGQAAD/2wBDAAgGBgcGBQgHBwcJCQ",
    "ImageSource1": 0,
    "Image3": "/9j/4AAQSkZJRgABAQEBkAGQAAD/2wBDAAgGBgcGBQgHBwcJCQ",
    "Image1": "/9j/4AAQSkZJRgABAQEBkAGQAAD/2wBDAAgGBgcGBQgHBwcJCQ",
    "IssueState: "USA",
    "Nationality": "USA",
    "PlaceOfBirth": "U.S.A",
    "SecondName": "J",
    "Sex": "Male",
    "Surname": "XYZ"
}

我希望从上方像下面这样子集:

{
"ID": "012B4567",
"Number: "123456789",
"Document": "PASSPORT",
 "IssueState: "USA",
 "Nationality": "USA",
 "PlaceOfBirth": "U.S.A",
 "SecondName": "J",
 "Sex": "Male",
 "Surname": "XYZ"
}

我尝试了以下代码。一切正常,但是我听不懂。我需要最简单的方法:

    var data={
    				"CDRValidation": "CDR Validation test passed",
    				"AirBaudRate": "424",
    				"ChipID": "012B4567",
    				"BACStatus": "TS_SUCCESS",
    				"SACStatus": "TS_NOT_PERFORMED",
    				"Data": "Test Line 1 >>>>>\nTest Line 2 >>>>>\nTest Line 3 >>>>>",
    				"DocType": "PASSPORT",
    				"DocNumber": "123456789",
    				"DocID": "PASSPORT",
    				"Surname": "Person",
    				"Forename": "IMA Phoney",
    				"SecondName": "J",
    				"Nationality"     : "Imaging Automation Demo State",
    				"Sex": "Male",
    				"DOB": "12 May 70",
    				"ExpiryDate": "01 Apr 12",
    				"IssueState": "Passport Agency Billerica",
    				"ExpiredFlag": false,
    				"ImageSource": 0,
    				"OptionalData1": "123456789123456",
            "OptionalData2": "",
            "DateOfIssue":"11 April 02",
            "PlaceOfBirth":"Illinois, U.S.A"
    }

    console.log("----------------->",data);

          var Fields = ({       
            IssueState,
            ExpiryDate,
            DateOfIssue,
            PlaceOfBirth,
            DOB,
            Sex,
            DocNumber,
            DocType
          } = data, {      
            IssueState,
            ExpiryDate,
            DateOfIssue,
            PlaceOfBirth,
            DOB,
            Sex,
            DocNumber,
            DocType
          })
          
          console.log("--------subset--------->",Fields);

3 个答案:

答案 0 :(得分:2)

有多种方法可以处理这种情况。正如您在示例中所做的那样,对象分解是一种简单的方法。您还可以使用数组存储所需的键并按如下所示编写代码

function subset(parentObj) {
  const keys = ['key1', 'key2', 'key3'];

  const obj = {};
  for (let i = 0, length = keys.length; i < length; i += 1) {
    obj[keys[i]] = parentObj[keys[i]];
  }

  return obj;
}

或者您也可以将上述代码与一些功能性编程一起使用

function subset(parentObj) {
  const keys = ['key1', 'key2', 'key3'];

  return keys.reduce((acc, key) => ({
    ...acc,
    [key]: parentObj[key];
  }), {});
}

答案 1 :(得分:1)

使用ES5来实现您的要求的一个简单方法是创建要保留的所有属性的列表,然后使用Array#reduce将每个属性添加到新对象。

// Saves vertical space for example
var original = JSON.parse(`{"Checksum":"OK","ID":"012B4567","DOB":"12-12-1991","Data":"Test Line 1 >>>>>↵Test Line 2 >>>>>↵Test Line 3 >>>>>","issue":"11-April-2015","DocID":"PASSPORT","Number":"123456789","Document":"PASSPORT","Photo":"Qk06AAAAAAAAA","ExpiredFlag":false,"ExpiryDate":"01 Apr 12","Forename":"IMA Phoney","Image2":"/9j/4AAQSkZJRgABAQEBkAGQAAD/2wBDAAgGBgcGBQgHBwcJCQ","ImageSource1":0,"Image3":"/9j/4AAQSkZJRgABAQEBkAGQAAD/2wBDAAgGBgcGBQgHBwcJCQ","Image1":"/9j/4AAQSkZJRgABAQEBkAGQAAD/2wBDAAgGBgcGBQgHBwcJCQ","IssueState":"USA","Nationality":"USA","PlaceOfBirth":"U.S.A","SecondName":"J","Sex":"Male","Surname":"XYZ"}`);

var propertiesToUse = ["ID", "Number", "Document", "IssueState", "Nationality", "PlaceOfBirth", "SecondName", "Sex", "Surname"];

var result = propertiesToUse.reduce(function(result, key) {
  return result[key] = original[key], result;
}, {});

console.log(result);

答案 2 :(得分:1)

您所做的是一种简单的方法,但是如果对它感到困惑,可以将其分为两行并进行解释。

此行实际上是对对象进行解构,并将对象中提到的键的值分配给相应的变量。

{       
            IssueState,
            ExpiryDate,
            DateOfIssue,
            PlaceOfBirth,
            DOB,
            Sex,
            DocNumber,
            DocType
          } = data

现在,每个变量都有单独的数据,但我们希望将其存储在对象中。因此,我们使用第二部分,即使用以下变量作为键来创建对象。

{
        IssueState,
        ExpiryDate,
        DateOfIssue,
        PlaceOfBirth,
        DOB,
        Sex,
        DocNumber,
        DocType
      }

结合使用时,您可以在单个语句中获得所需的结果。