JavaScript: создание двухмерного массива объектов на основе условия

Я видел эту ситуацию в своем проекте. Фактически, когда прокси генерирует код из 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, если нет, переданное значение является значением по умолчанию.

Надеюсь, что решить вашу проблему

1
задан Shidersz 19 January 2019 в 03:13
поделиться

2 ответа

Первое, что я пришёл в голову, это то, что вам нужно сначала отсортировать входные данные. потому что ваши данные (как указано в вопросе) не единственный возможный способ получения данных.

Вы можете иметь некоторые данные, такие как:

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 );

0
ответ дан mrReiha 19 January 2019 в 03:13
поделиться

Вы можете подойти к этому с помощью 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);

В предыдущем коде накопленный объект имеет следующие ключи:

  • r : Множество укрытий генерируется постепенно.
  • c : счетчик животных текущего приюта (см. Далее).
  • а : Текущий приют животных.

Когда reduce закончится, последнее укрытие (в собственности a) не будет находиться в массиве укрытий. Итак, мы должны поставить его вручную (это то, что делает дополнительная строка).

0
ответ дан Shidersz 19 January 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: