如何用三个jsons创建一个新的json?

时间:2018-05-29 19:39:26

标签: javascript jquery json

我有3个不同的jsons,我需要从每个js推断一些数据并用它创建一个新的json。这三个jsons有一个共同的id标识符,一个唯一的标识符,所以我们可以将它用作匹配,因为它们实际上是三个不同的大jsons。

在json上我们有"id":"265",有两个和三个"article_id":"265",所以当我们循环时这些可以作为参考点。

我从未和json一起工作,所以我不知道如何处理它。我把jQuery和JS作为标签,因为它们是我最熟悉的。

1

{  
   "id":"265",
   "title":"Battle of Gettysburg",
   "page_id":"4849",
   "language_id":"en",
   "original_time":"July 1\u20133, 1863"
}

2

{  
   "id":"185",
   "original_name":"United States",
   "country_id":"24",
   "article_id":"265"
}

第3

{  
   "id":"73",
   "month":"July",
   "year":"1863",
   "suffix":"",
   "article_id":"265"
}

所以我要找的最终结果是单个json,我们将idtitle作为json 1中的对象,然后我们从json 2中获取original_name来自json three的year对象,我们将拥有:

{
   "id":"265",
   "title":"Battle of Gettysburg",
   "original_name":"United States",
   "year":"1863"
}

注意

上面的json只是例子,实际上它们是三个巨大的列表,我能做的(手动),就是加入它们以便拥有一个json。

5 个答案:

答案 0 :(得分:1)

基本上你要做的是使用JavaScript对象模仿SQL JOIN:

  1. 在所有三个JSON集合上使用JSON.parse()将它们转换为对象数组。
  2. 遍历JSON 1对象;对于每个对象......
  3. 迭代JSON 2对象,测试文章ID是否与我们正在迭代的JSON 1中的ID匹配。保存此对象。
  4. 遍历JSON 3对象,测试ID是否与我们从JSON中找到的对象的ID匹配。保存此对象。
  5. 拥有所有三个对象后,创建一个仅包含所需字段的新对象文字:

    {
      Id: obj1.id,
      Title: obj1.title,
      Original_name: obj2.original_name,
      Year: obj3.year
    }
    

答案 1 :(得分:1)

这里有一些术语混淆;根据您的意见,您可能会问两个非常不同的问题之一。幸运的是,其中一个很容易回答,所以让我们两个都做。

(我正在将details加载json字符串移到浏览器中并将它们转换为javascript对象。)

如果您有三个对象

...那么这只是在构造输出对象时单独输出所需的字段:

|| RPAD ((LPAD (c.total_acct), 6, 0), 6) 
|| RPAD ((LPAD (c.total_amt), 14, '0'), 14)

如果您有三个列表对象:

...在这种情况下,它更复杂(而且更有趣)。在这种情况下,您需要匹配每个列表中共享相同ID的对象的字段。

以下绝对不是最有效或节省内存的方法;我已经把事情传播到(希望)让它更容易遵循它正在做的事情。

我做了两个假设:

  • 在每个列表中,所有ID都是唯一的(这意味着您在一个JSON文件中不会有两个具有相同ID的对象)
  • 每个ID都会出现在所有三个列表中(这意味着您不需要处理输出中缺少的字段)

var in1 = {
  "id": "265",
  "title": "Battle of Gettysburg",
  "page_id": "4849",
  "language_id": "en",
  "original_time": "July 1\u20133, 1863"
};

var in2 = {
  "id": "185",
  "original_name": "United States",
  "country_id": "24",
  "article_id": "265"
}

var in3 = {
  "id": "73",
  "month": "July",
  "year": "1863",
  "suffix": "",
  "article_id": "265"
}

// construct a new object using the selected fields
// from each object in1, in2, or in3:
var out = {
  id: in1.id,
  title: in1.title,
  original_name: in2.original_name,
  year: in3.year
}

console.log(out);

答案 2 :(得分:1)

是否要组合 n 个JSON对象,例如您可以采用功能方法并使用reduce + filter的对象列表。

const data = [{
    "id":"265",
    "title":"Battle of Gettysburg",
    "page_id":"4849",
    "language_id":"en",
    "original_time":"July 1\u20133, 1863"
  },
  {
     "id":"185",
     "original_name":"United States",
     "country_id":"24",
     "article_id":"265"
  },
  {
    "id":"73",
     "month":"July",
     "year":"1863",
     "suffix":"",
     "article_id":"265"
  }];

const final = data.reduce((accu, { id, title }, index, array) => {
  // Find any related objects
  const matches = array.filter(data => data.article_id === id);

  if (matches.length) {
    // Flatten them for ease of access. Duplicate keys will override.
    const flat = matches.reduce((arr, item) => ({ ...arr, ...item }), [])

    // Return new object
    return accu.concat({
      ...flat,
      id,
      title,
    });
  }
  return accu;
}, []);

console.log(final, '<<')

// Witness
document.getElementById('results').innerHTML = JSON.stringify(final);
<div id="results" style="font-family: Courier; font-size 14px; color: #fff; background: #000; padding: 20px; max-width: 80vw;"></div>

答案 3 :(得分:-1)

编辑*

也许这就是你需要的东西?

let arrPages = [{  
   "id":"265",
   "title":"Battle of Gettysburg",
   "page_id":"4849",
   "language_id":"en",
   "original_time":"July 1\u20133, 1863"
}];

let arrArticles = [{  
   "id":"185",
   "original_name":"United States",
   "country_id":"24",
   "article_id":"265"
},
{  
   "id":"73",
   "month":"July",
   "year":"1863",
   "suffix":"",
   "article_id":"265"
}];

let getResult = (arrInput, arrCompare) => {
  let joinedItems = [];
  arrInput.forEach(item => {
    let newItem = { id: item.id, title: item.title };
    arrCompare.forEach(subItem => {
      if(subItem.article_id !== undefined && subItem.article_id === item.id){
        if(subItem.original_name !== undefined)
          newItem.original_name = subItem.original_name;
        if(subItem.year !== undefined)
          newItem.year = subItem.year;
      }
    });
    
  joinedItems.push(newItem);
  });
  
  return joinedItems;
};

let result = getResult(arrPages, arrArticles);

console.log(result);

答案 4 :(得分:-1)

在代码的第一部分中,我创建了一个包含json数据的var 为了解决问题,我创建了2个函数,创建的顺序不同,第一个函数getJSONData()将json数据作为参数,并返回由数组keys中定义的键过滤的对象。 secound函数只检查当前键是否存在于keys数组中,此函数可以用jQuery.inArray()方法替换。

// JSON data 
var json = [{  
       "id":"265",
       "title":"Battle of Gettysburg",
       "page_id":"4849",
       "language_id":"en",
       "original_time":"July 1\u20133, 1863"
    },
    {  
       "id":"185",
       "original_name":"United States",
       "country_id":"24",
       "article_id":"265"
    },
    {  
       "id":"73",
       "month":"July",
       "year":"1863",
       "suffix":"",
       "article_id":"265"
    }]

// keys that i want
var keys = ["title", "original_name", "year"];

// var that will have the filtered data
var newJSON = getJSONData(json);


console.log(JSON.stringify(newJSON))

// this is the main function of the code 
// here we iterate in the json creating a new object that has all the tags definid in the keys array
function getJSONData(arrayJSON){
  var JSONFiltered = {};
  for(var i in arrayJSON){
    for(var key in arrayJSON[i]){
      if(hasElement(key)){
        JSONFiltered[key] = arrayJSON[i][key];
      }
    }
  }
  return JSONFiltered;
}

// this function is used to check a key is present in the array of keys
function hasElement(key){
  for(var elem in keys){
    if(keys[elem] == key) return true;
  }
  return false;
}