Я видел эту ситуацию в своем проекте. Фактически, когда прокси генерирует код из WSDL, каждый параметр будет иметь автоматически сгенерированный флаг, например. если ваше поле IsActive
, то автогенерированное свойство будет IsActiveSpecified
, см. ниже.
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public System.bool IsActive{
get {
return this.isActiveField;
}
set {
this.isActiveField= value;
this.RaisePropertyChanged("IsActive");
}
}
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool IsActiveSpecified{
get {
return this.IsActiveSpecified;
}
set {
this.IsActiveSpecified= value;
this.RaisePropertyChanged("IsActiveSpecified");
}
}
Таким образом, вы должны установить IsActiveSpecified=true
, если нет, переданное значение является значением по умолчанию.
Надеюсь, что решить вашу проблему
Первое, что я пришёл в голову, это то, что вам нужно сначала отсортировать входные данные. потому что ваши данные (как указано в вопросе) не единственный возможный способ получения данных.
Вы можете иметь некоторые данные, такие как:
let array1 = [
{ "region": "NE", quantity: 25 },
{ "region": "NW", quantity: 21 },
{ "region": "Central", quantity: 20 },
{ "region": "SE", quantity: 43 },
{ "region": "SW", quantity: 18 },
]
, и в этом примере мы должны были собрать центральный и SW вместе, но не сортировать входные данные на первом месте приведут центральный и SW в разных массивах.
Итак, заключение. Я думаю, что это сработает:
var make = function( arr ) {
var res = [],
currentArr = [];
arr.forEach( v => {
sum += v.quantity;
if ( sum <= capacity ) {
currentArr.push( v );
} else {
res.push( currentArr );
currentArr = [ v ];
sum = v.quantity;
}
});
res.push( currentArr );
return res;
},
array1 = [
{ "region": "NE", quantity: 25 },
{ "region": "NW", quantity: 21 },
{ "region": "Central", quantity: 20 },
{ "region": "SE", quantity: 43 },
{ "region": "SW", quantity: 18 }
],
sum = 0,
result,
capacity = 50;
array1.sort( ( a, b ) => {
return a.quantity - b.quantity;
});
console.log( array1 );
result = make( array1 );
console.log( result );
Вы можете подойти к этому с помощью Reduce () , используя пользовательский объект в качестве начального accumulator
. Когда сокращение завершится, вам потребуется дополнительная строка кода, чтобы получить окончательный результат.
const animal_shelter_capacity = 50;
const array1 = [
{"region": "NE", quantity: 25},
{"region": "NW", quantity: 21},
{"region": "SE", quantity: 43},
{"region": "SW", quantity: 18},
{"region": "Central", quantity: 20}
];
let obj = array1.reduce((res, curr) =>
{
let test = (curr.quantity + res.c >= animal_shelter_capacity);
return {
r: test ? [...res.r, res.a] : res.r,
c: test ? curr.quantity : res.c + curr.quantity,
a: test ? [curr] : [...res.a, curr]
};
},{r:[], c:0, a:[]});
let newArr = [...obj.r, obj.a];
console.log(newArr);
В предыдущем коде накопленный объект имеет следующие ключи:
Когда reduce
закончится, последнее укрытие (в собственности a
) не будет находиться в массиве укрытий. Итак, мы должны поставить его вручную (это то, что делает дополнительная строка).