pushIntoBucket.js

import _get from './get';
import _set from './set';

/**
 * Push an value into an array element of a collection
 * @alias object.pushIntoBucket
 * @param {Object} collection
 * @param {string} key
 * @param {Object} value
 * @param {boolean} [flattenArray=false] - Whether to flatten the array, if the given value is an array.
 * @returns {*} The modified bucket
 */
function pushIntoBucket(collection, key, value, flattenArray) {
    let bucket = _get(collection, key);

    if (Array.isArray(bucket)) {
        if (Array.isArray(value) && flattenArray) {
            bucket = bucket.concat(value);
            _set(collection, key, bucket);
        } else {
            bucket.push(value);
        }
    } else if (bucket == null) {
        bucket = Array.isArray(value) && flattenArray ? value.concat() : [value];
        _set(collection, key, bucket);
    } else {
        bucket = Array.isArray(value) && flattenArray ? [bucket, ...value] : [bucket, value];
        _set(collection, key, bucket);
    }

    return bucket;
}

export default pushIntoBucket;