我有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,我们将id
和title
作为json 1中的对象,然后我们从json 2中获取original_name
来自json three的year
对象,我们将拥有:
{
"id":"265",
"title":"Battle of Gettysburg",
"original_name":"United States",
"year":"1863"
}
注意
上面的json只是例子,实际上它们是三个巨大的列表,我能做的(手动),就是加入它们以便拥有一个json。
答案 0 :(得分:1)
基本上你要做的是使用JavaScript对象模仿SQL JOIN:
JSON.parse()
将它们转换为对象数组。拥有所有三个对象后,创建一个仅包含所需字段的新对象文字:
{
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的对象的字段。
以下绝对不是最有效或节省内存的方法;我已经把事情传播到(希望)让它更容易遵循它正在做的事情。
我做了两个假设:
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;
}