避免在JavaScript中进行多个数组遍历

时间:2017-05-27 03:54:56

标签: javascript

代码的目标是生成一个新数组,该数组将所有标签与10或更大的数字组件组合到一个标签为V10+的对象中。新对象值将是最大标签的值。

在以下示例中,V13是最大的标签,因此将使用其值:

[{'V10', 11}, {'V11', 123}, {'V12', 112}, {'V13', 120}] => {'V10+', 120}

目前,我必须在阵列上使用findmap,然后使用reduce。有没有人建议简化这个?

var someObjects = [
    {'label': 'VS', 'value': 1 },
    {'label': 'V1', 'value': 2 },
    {'label': 'V2', 'value': 3 },
    {'label': 'V3', 'value': 4 },
    {'label': 'V4', 'value': 5 },
    {'label': 'V5', 'value': 6 },
    {'label': 'V6', 'value': 7 },
    {'label': 'V7', 'value': 8 },
    {'label': 'V8', 'value': 9 },
    {'label': 'V9', 'value': 10 },
    {'label': 'V10', 'value': 11 },
    {'label': 'V11', 'value': 123 },
    {'label': 'V12', 'value': 112 },
    {'label': 'V13', 'value': 120 },
    {'label': 'VE', 'value': 13 }
];

var maxObjVal = someObjects.find(function(obj) {
    var max =  Math.max.apply(null, someObjects.map(function (s) {
        var labelNumber = s.label.substring(1);
        return +labelNumber || 0;
    }));

    return obj.label == 'V' + max;
}).value;

var result = someObjects.reduce(function (ten) {
        return function (r, a) {
            var n = +a.label.substring(1);
            if (n >= 10) {
                if (!ten) {
                    ten = { label: 'V10+', value: maxObjVal };
                    r.push(ten);
                }
            } else {
                r.push(a);
            }
            return r;
        };
    }(), []);

console.log('result: ' + JSON.stringify(result));

2 个答案:

答案 0 :(得分:0)

您可以通过阵列进行单次迭代。在定义someObjects之后尝试这个:

class MyMail extends Mailable
{
    use Queueable, SerializesModels;

    public $first_name, $last_name, $amount_donated, $hashed_id;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($first_name,$last_name,$amount_donated,$hashed_id)
    {
        $this->first_name = $first_name;
        $this->last_name = $last_name;
        $this->amount_donated = $amount_donated;
        $this->hashed_id = $hashed_id;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('myemail12341@gmail.com')
            ->view('emails.singlereceipt');
    }

答案 1 :(得分:0)

如果您愿意牺牲高阶函数,可以在一次迭代中完成此任务。只需跟踪最大值并即时创建新阵列。然后,您可以将具有最大值的V10+推送到数组。



    var someObjects = [
    {'label': 'VS', 'value': 1 },
    {'label': 'V1', 'value': 2 },
    {'label': 'V2', 'value': 3 },
    {'label': 'V3', 'value': 4 },
    {'label': 'V4', 'value': 5 },
    {'label': 'V5', 'value': 6 },
    {'label': 'V6', 'value': 7 },
    {'label': 'V7', 'value': 8 },
    {'label': 'V8', 'value': 9 },
    {'label': 'V9', 'value': 10 },
    {'label': 'V10', 'value': 11 },
    {'label': 'V11', 'value': 123 },
    {'label': 'V12', 'value': 112 },
    {'label': 'V13', 'value': 120 },
    {'label': 'VE', 'value': 13 }
];

result = [];
// Will keep track of max label and value. e.g. [13, 120]
maxValue = [0, 0];

let getNumbers = (s) => { return +s.substring(1) || 0 };

someObjects.forEach(function(element) {
    if (element.hasOwnProperty("label")) {
        let number = getNumbers(element["label"]);
        if (number < 10) { // Keep this object as is
            result.push(element)
        } else {
            if (number > maxValue[1]) { // Check for a new max
                maxValue[0] = element["value"];
                maxValue[1] = number
            }
        }
    }
});
// Finally push the aggregated label and max value to the array.
result.push({"label": 'V10+', 'value': maxValue[0]});
console.log(result);
&#13;
&#13;
&#13;