根据Javascript中的列表从Json提取字段

时间:2019-07-09 18:58:32

标签: javascript json

我正在尝试从Json响应中提取一些字段,并将其推送到Javascript数组中。我希望对字段的选择是可配置的。这是我在做什么:

将此作为我的JSON字符串:

{
    "id" : "1234",
    "orderNumber" : "1196",
    "createdOn" : "2019-07-02T12:03:39.697Z",
    "modifiedOn" : "2019-07-02T12:25:52.126Z",
    "testmode" : false,
    "customerEmail" : "a@b.com",
    "billingAddress" : {
      "firstName" : "John",
      "lastName" : "Doe",
      "address1" : "Wall Street",
      "address2" : null,
      "city" : "NYC",
      "state" : "NY",
      "countryCode" : "US",
      "postalCode" : "12345",
      "phone" : "1122334455"
    }
}

说我想提取一些字段(在FIELDS变量中定义)并将它们放入数组中。

# NOTE: the variable `data` here is my json object 

var FIELDS = ['id', 'orderNumber', 'customerEmail', 'billingAddress.firstName', 'billingAddress.lastName']

var lineItem = []

# parse the data (my Json object)
for (var i = 0; i < FIELDS.length; i++){
  lineItem.push(data[FIELDS[i]])
}

因此,对于第一级(id,orderNumber和customerEmail)来说,这似乎工作正常,但对于billingAddress.firstname等而言却没有。这就是我想知道的。

我的意图是能够修改FIELDS变量中的定义,而无需对代码中的逻辑进行任何更改。

希望这是有道理的。 谢谢!

2 个答案:

答案 0 :(得分:1)

只要键名中没有句号,它就会起作用。

var data = {
    "id" : "1234",
    "orderNumber" : "1196",
    "createdOn" : "2019-07-02T12:03:39.697Z",
    "modifiedOn" : "2019-07-02T12:25:52.126Z",
    "testmode" : false,
    "customerEmail" : "a@b.com",
    "billingAddress" : {
      "firstName" : "John",
      "lastName" : "Doe",
      "address1" : "Wall Street",
      "address2" : null,
      "city" : "NYC",
      "state" : "NY",
      "countryCode" : "US",
      "postalCode" : "12345",
      "phone" : "1122334455"
    }
};

var FIELDS = ['id', 'orderNumber', 'customerEmail', 'billingAddress.firstName', 'billingAddress.lastName'];

var lineItem = [];
for (var i = 0; i < FIELDS.length; i++){
  let obj = data;
  let parts = FIELDS[i].split(".");
  while(parts.length) obj = obj[parts.shift()];
  lineItem.push(obj)
}

console.log(lineItem);

答案 1 :(得分:1)

您只需要一个函数即可在.上拆分该路径并遍历JSON数据。这样,您可以map()遍历您的字段。

let data = {"id" : "1234","orderNumber" : "1196","createdOn" : "2019-07-02T12:03:39.697Z","modifiedOn" : "2019-07-02T12:25:52.126Z","testmode" : false,"customerEmail" : "a@b.com","billingAddress" : {"firstName" : "John","lastName" : "Doe","address1" : "Wall Street","address2" : null,"city" : "NYC","state" : "NY","countryCode" : "US","postalCode" : "12345","phone" : "1122334455"}}
var FIELDS = ['id', 'orderNumber', 'customerEmail', 'billingAddress.firstName', 'billingAddress.lastName']

// split an traverse
const getFromPath = (path, data) => path.split('.')
      .reduce((curr, p) => curr && curr[p], data) // check for curr incase path is undefined
      
console.log(FIELDS.map(p => getFromPath(p, data)))

如果在对象中找不到遍历的任何部分,则函数getFromPath将返回undefined