我有以下2个数组:
groupedObjects: [
{ value: 125, currency: "EUR" },
{ value: 100, currency: "USD" },
{value: 320, currency: "RON" }
]
groupedObjects1: [
{ value: 500, currency: "EUR" },
{ value: 280, currency: "RON" }
]
我怎样才能让这两个数组看起来相同? 代码看起来像我想要的第二个数组:
[
{ value: 500, currency: "EUR" },
{ value: 0, currency: "USD" },
{ value: 280, currency: "RON" }
]
我试过这段代码:
if ($(groupedObjects).length > $(groupedObjects1).length) {
_.each(groupedObjects,function(obj){
i++;
_.each(groupedObjects1,function(obj1){
if(obj.currency != obj1.currency) {
alert('Test');
groupedObjects1.push ({
value: '',
currency: ''
});
}
});
});
}
我希望两个数组都按货币排序,并且两者都应该具有相同数量的元素,无论数组是否更大
答案 0 :(得分:0)
groupedObjects= [
{ value: 125, currency: "EUR" },
{ value: 100, currency: "USD" },
{value: 320, currency: "RON" }
];
groupedObjects1= [
{ value: 500, currency: "EUR" },
{ value: 280, currency: "RON" }
];
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;
}
答案 1 :(得分:0)
嗯,有几种方法可以解决这个问题,并且将一个将空白值添加到数组中的函数混合在一起肯定是其中之一,但更面向对象的方法可以帮助你更多。 / p>
我不确定"先进"你使用的是javascript,所以我很抱歉,如果这听起来像是在告诉你。
我们要做的第一件事是设置一个Currency类。有几种方法可以做到这一点,但我更喜欢下面的方法,很可能是因为我来自C ++背景。如果您愿意,请随意使用其他方法。
function Currency(type, quantity){
this.type = type;
this.quantity = quantity;
}
如果需要,您可以添加一些验证,例如确保数量大于0或该类型是有效货币。您也可以将这些属性设为私有并为它们实现访问器,但我现在只是想保持简单。如果您愿意,可以为每种货币扩展它,因此您可以说new USD(280)
创建一个值为280的USD对象。
所以,现在我们的货币已经结算,我们可以考虑如何存储它们。我们希望确保如果我们没有添加货币,其数量等于0.为此,我们将为每种货币实例化一个对象,然后根据需要设置其值。 / p>
这是一个非常简单的实现:
function CurrencyList(){
var valid_currencies = ["EUR", "RON", "USD"];
this.currencies = [];
for(i in valid_currencies){
this.currencies[i] = new Currency(valid_currencies[i], 0);
}
}
我刚刚创建了一系列有效货币,通过它们进行迭代,然后创建一个" public"具有有效货币对象的属性。我将它存储在一个像你已经存在的数组中,它只是在一个对象中。
但是,我们还没有完成。如果某个邪恶的人删除了我们阵列中的一个元素怎么办?我们会回到原来的问题。我们可以通过在对象外隐藏currencies
来解决这个问题。
function CurrencyList(){
var valid_currencies = ["EUR", "RON", "USD"];
currencies = [];
for(i in valid_currencies){
currencies[i] = new Currency(valid_currencies[i], 0);
}
}
现在,如果我们尝试这样的事情:
var currency_list = new CurrencyList();
alert(currency_list.currencies[0]);
我们收到错误,这意味着无法从外部修改我们的数组。
这引入了另一个问题:如果我们想查看数组中的元素怎么办?答案是实现一个访问器(" get")方法。
我们所需要的只是创造一个公共"属性并将其设置为等于函数,如下所示:
this.at = function(index){
return currencies[index];
}
现在我们可以访问这样的货币:
var currency_list = new CurrencyList();
alert(currency_list.at(0));
这就是所有这些:
function CurrencyList(){
var valid_currencies = ["EUR", "RON", "USD"];
currencies = [];
for(i in valid_currencies){
currencies[i] = new Currency(valid_currencies[i], 0);
}
this.at = function(index){
return currencies[index];
}
}
function Currency(type, quantity){
this.type = type;
this.quantity = quantity;
}
这将确保您不会有不匹配的阵列,因此我们不必费心使用hacky,post hoc解决方案。换句话说,它并没有解决您的问题,而是防止问题永远存在,这是一个更好的解决方案。它还确保您的数组按货币排序,因为元素将始终按照您在构造函数中指定的顺序。
答案 2 :(得分:0)
请勿在同一索引中使用push()
插入项目。
使用:
if ($(groupedObjects).length > $(groupedObjects1).length) {
_.each(groupedObjects,function(obj){
i++;
_.each(groupedObjects1,function(index, obj1){
if(obj.currency != obj1.currency) {
alert('Test');
groupedObjects1[index] = ({
value: '',
currency: ''
});
}
});
});
}