
array1 = [
{
"name":
{
"common": "Afghanistan",
"official": "Islamic Republic of Afghanistan",
"capital": [ "Kabul" ]
}
}]
array2 = [
{
"capital": [ "Kabul" ],
"population": 2837743
}];
我想成功
[{
"name":
{
"common": "Afghanistan",
"official": "Islamic Republic of Afghanistan",
"capital": [ "Kabul" ],
"population": 2837743
}
}]
我想合并到一組物件并制作一個陣列。我試圖用過濾方法和查找方法來制作,但不能解決問題
uj5u.com熱心網友回復:
嘗試這樣做有一些問題,因為您需要一種從語意角度處理合并的方法。您需要選擇合并將匹配的欄位。例如,如果兩個國家的人口相同,您不希望它們被匹配然后合并。
您還需要注意并計劃出現兩個以上的專案匹配。立即想到的一個問題是兩個物件是否匹配但具有沖突的資訊。即使他們真的是一對,這也可能發生。人口會隨著時間而變化。即使是像資本變化這樣僵化的事情。
從演算法上講,我將建議兩種匹配方法。兩者中更簡單的是擁有一個您想要匹配物件的可能欄位串列。然后,您可以創建一個陣列(其他語言中的字典或哈希圖),您可以通過目前看到的值來鍵入該陣列。
var capital_map = []
for(country in countries1 countries2){
if (capital_map[country.capital]){
//We have a match that we can then handle
}else{
//set up for possible matches down the array
capital_map[country.capital] = country
}
在上面的例子中,我們只匹配了資本。您可以擴展它,如果許多欄位中的任何一個匹配,那么我們合并兩個元素或 N 個欄位中的至少 n 個匹配。
我要建議的另一種方法是創建一個定義一些加權匹配的函式。例如,重疊的欄位的比例是相同的,每個欄位根據重要性加權,因此人口的重要性較低,而資本的重要性可能較高。
我不知道您是否想更深入地了解兩個陣列的匹配嵌套,例如使用名稱與官方名稱,但我希望您至少對可以使用的各種技術有更好的了解那。您可能有大寫陣列,因為您希望通過匹配但具有重疊欄位的物體出現問題,并且不想擔心解決方案。(例如僅取人口的平均值)如果您確實打算將其擴展到兩個以上的資料源,兩個以上的陣列,您可以執行諸如投票之類的事情,其中??每個源都對其答案進行投票。如果兩個訊息來源說首都是巴西利亞,而三個訊息來源中只有一個說里約,那么你可以選擇巴西利亞。
uj5u.com熱心網友回復:
你可以做這樣的事情(我capital作為一個陣列留下,但如果不是這樣會更簡單):
const arr1 = [
{
name: {
common: 'Afghanistan',
official: 'Islamic Republic of Afghanistan',
},
capital: ['Kabul'],
},
{
name: {
common: 'Albania',
official: 'Republic of Albania',
},
capital: ['Tirana'],
},
];
const arr2 = [
{ capital: ['Tirana'], population: 2845955 },
{ capital: ['Kabul'], population: 2837743 },
];
const populationByCapital = new Map();
for (let el of arr2) {
populationByCapital.set(el.capital[0], el.population);
}
const arr3 = arr1.map((el) => {
return { ...el, population: populationByCapital.get(el.capital[0]) };
});
console.log(arr3);
這應該給你:
[
{
name: {
common: 'Afghanistan',
official: 'Islamic Republic of Afghanistan'
},
capital: [ 'Kabul' ],
population: 2837743
},
{
name: { common: 'Albania', official: 'Republic of Albania' },
capital: [ 'Tirana' ],
population: 2845955
}
]
請注意,如果有兩個國家/地區的首都名稱相同,則可能會中斷。
編輯
我現在看到您正在使用來自restcountries.com的 API ,因此更改capital為標量超出了您的控制范圍。它是一個陣列是有原因的——南非有 3 個首都。代碼應該仍然有效,因為它是相同的 API,并且所有 3 個在兩個端點中都以相同的順序列出。
但是有一些并發癥。布韋島國顯然沒有首都,所以陣法將是空的,而諾福克島國和牙買加都以“金斯敦”為首都。要解決這兩個問題,您可以更改密鑰以包含國家/地區名稱和首都:
const populationByCapital = new Map();
for (let el of arr2) {
populationByCapital.set(el.capital[0] el.name.common, el.population);
}
const arr3 = arr1.map((el) => {
return {
...el,
population: populationByCapital.get(el.capital[0] el.name.common),
};
});
uj5u.com熱心網友回復:
我修改了您的起始資料以修復一些語法錯誤:
const array1 = [
{
name: {
common: 'Afghanistan',
official: 'Islamic Republic of Afghanistan',
},
capital: ['Kabul'],
},
];
const array2 = [
{
capital: ['Kabul'],
population: 2837743,
},
];
根據要求,此合并使用 filter 方法來匹配兩個物件:
const newArray = array1.map((arr1Obj) => {
const capitalObj = array2.filter(
(arr2Obj) =>
JSON.stringify(arr1Obj.capital) === JSON.stringify(arr2Obj.capital)
);
return Object.assign(arr1Obj, ...capitalObj);
});
console.log(newArray);
輸出:
[
{
name: {
common: 'Afghanistan',
official: 'Islamic Republic of Afghanistan',
},
capital: ['Kabul'],
population: 2837743,
},
];
uj5u.com熱心網友回復:
首先處理array2的資料,構建任意一個key為capitol,value為object的物件。使用map和 array1 并從流程資料(track2)中添加相應的國會大廈資訊
const array1 = [
{
name: {
common: "Afghanistan",
official: "Islamic Republic of Afghanistan",
},
capital: ["Kabul"],
},
];
const array2 = [
{
capital: ["Kabul"],
population: 2837743,
},
];
const track2 = {};
array2.forEach(({ capital: [city], ...rest }) => (track2[city] = rest));
const result = array1.map((item) => ({
...item,
...track2[item.capital?.[0]],
}));
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/367666.html
標籤:javascript 数组 ecmascript-6 合并
