簡體   English   中英

標准化2個javascript數組以使其看起來相同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM