[英]Normalize 2 javascript arrays to look the same
我在讓兩個2D陣列看起來相似時遇到問題。 數組如下所示:
groupedObjects: [
{ value: 125, currency: "EUR" },
{ value: 100, currency: "USD" },
{value: 320, currency: "RON" }
]
groupedObjects1: [
{ value: 500, currency: "EUR" },
{ value: 280, currency: "RON" }
]
要么
groupedObjects: [
{ value: 125, currency: "EUR" }
]
groupedObjects1: [
{ value: 500, currency: "EUR" },
{ value: 280, currency: "RON" }
]
要么
groupedObjects: [
{ value: 125, currency: "EUR" }
]
groupedObjects1: [
{ value: 500, currency: "EUR" }
]
要么
groupedObjects: [
{ value: 125, currency: "EUR" }
]
groupedObjects1: [
]
數組可以是任何大小,可以使用無限制的貨幣,但長度並不總是相等。 我怎樣才能使這兩個數組看起來相同? 如果一個數組不包含一種貨幣,我希望該數組具有一個{value:0,currency:'missing currency'}的元素,並且兩個數組中的所有貨幣都必須按升序排列,並按貨幣排序
有任何想法嗎? 先感謝您
稍后編輯:我嘗試的代碼如下:
if ($(groupedObjects).length > $(groupedObjects1).length) {
var newArray = [];
$.each(groupedObjects, function (key, value) {
var flag = false;
var breakout = false;
flag = (function () {
$.each(groupedObjects1, function (key1, value1) {
if (value.currency === value1.currency) {
newArray.push(value1);
breakout = true;
return false;
}
});
if (!breakout) {
return true;
}
})();
if (flag) {
newArray.push({
value: 0,
currency: value.currency
});
}
});
groupedObjects1 = newArray;
} else if ($(groupedObjects).length < $(groupedObjects1).length) {
var newArray = [];
$.each(groupedObjects1, function (key, value) {
var flag = false;
var breakout = false;
flag = (function () {
$.each(groupedObjects, function (key1, value1) {
if (value.currency === value1.currency) {
newArray.push(value1);
breakout = true;
return false;
}
});
if (!breakout) {
return true;
}
})();
if (flag) {
newArray.push({
value: 0,
currency: value.currency
});
}
});
groupedObjects = newArray;
} else if ($(groupedObjects).length == $(groupedObjects1).length) {
var newArray = [];
var oldArray = [];
oldArray = groupedObjects;
console.info('>>> Initial object 1');
console.info(groupedObjects);
$.each(groupedObjects1, function (key, value) {
var flag = false;
var breakout = false;
flag = (function () {
$.each(groupedObjects, function (key1, value1) {
if (value.currency === value1.currency) {
newArray.push(value1);
breakout = true;
return false;
}
});
if (!breakout) {
return true;
}
})();
if (flag) {
newArray.push({
value: 0,
currency: value.currency
});
}
});
//groupedObjects = newArray;
$.merge(groupedObjects, newArray);
var newArray = [];
$.each(oldArray, function (key, value) {
var flag = false;
var breakout = false;
flag = (function () {
$.each(groupedObjects1, function (key1, value1) {
if (value.currency === value1.currency) {
newArray.push(value1);
breakout = true;
return false;
}
});
if (!breakout) {
return true;
}
})();
if (flag) {
newArray.push({
value: 0,
currency: value.currency
});
}
});
groupedObjects1 = newArray;
//$.merge(groupedObjects1, newArray);
}
我不確定您的最終目標是什么,但這是一個示例:
var arr1 = [
{ value: 125, currency: "EUR" },
{ value: 100, currency: "USD" },
{ value: 320, currency: "RON" }
],
arr2 = [
{ value: 500, currency: "EUR" },
{ value: 280, currency: "RON" }
];
var appendMissingCurrencies = (function () {
return function (dest, source) {
//Use an object map for quick lookups
var existingCurrenciesMap = currencyMapFrom(dest);
source.forEach(function (item) {
var currency = item.currency,
currencyMissing = !existingCurrenciesMap[currency];
if (currencyMissing) {
existingCurrenciesMap[currency] = true;
appendMissingCurrency(dest, currency);
}
});
};
function appendMissingCurrency(currencies, currency) {
currencies.push({ value: 0, currency: currency });
}
function currencyMapFrom(currencies) {
return currencies.reduce(function (map, item) {
if (!map[item.currency]) map[item.currency] = true;
return map;
}, {});
}
})();
function sortCurrencies(currencies) {
return currencies.sort(function (a, b) {
var currencyOrder = a.currency < b.currency? -1 : +(a.currency > b.currency);
return currencyOrder? currencyOrder : a.value - b.value;
});
}
appendMissingCurrencies(arr1, arr2);
appendMissingCurrencies(arr2, arr1);
arr1 = sortCurrencies(arr1);
arr2 = sortCurrencies(arr2);
由於currency
是所需算法的驅動力。 第一步是找到兩個數組之間的通用貨幣set
並對其進行排序。
container.currencies = (function(){
var array = [];
var func = function(arrayKey){ return function(key,value){
array.push(value.currency);
container.map[arrayKey][value.currency] = value.value;
}
};
$.each(a, func('a'));
$.each(b, func('b'));
return array.filter(function(elem, pos) {
return array.indexOf(elem) == pos;
}).sort()
})();
在確定唯一的貨幣集的同時,我們還在建立上下文數據映射- container
保存數據上下文, a
/ b
表示原始數組,還用作每個原始數組下的屬性鍵內容被存儲。 如果空container
看起來像: {map: {a:{}, b:{}}, currencies:[]}
建立數據上下文后,我們需要將其回滾到數組中。
container.getNormalizedArrays = function(){
var arrays = {a: [], b: []};
function normalizer(target, currency){
var value = container.map[target][currency]
arrays[target].push({value: value?value:0, currency: currency})
}
$.each(container.currencies, function(key, value){
normalizer('a', value);
normalizer('b', value);
})
return arrays;
}
查看我的小提琴以獲得完整的工作示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.