JavaScript Операции с массивами в элементе управления MS Script - PullRequest
1 голос
/ 05 апреля 2020

Это вопрос JavaScript, но ... моя цель - использовать Microsoft Script Control в Excel VBA для выполнения операций с массивами. Элемент управления сценарием использует MS JScript, примерно равный ES3, но не имеющий оконного объекта.

Когда я говорю операции с массивами, я имею в виду ... если [a] является массив из 100 чисел, а [b] - это массив из еще 100 чисел; я ищу, чтобы JScript возвратил новый массив [c] из 100 чисел, каждый элемент которого равен указанной операции над [a] и [ b], элемент за элементом.

Код, который я написал ниже, работает просто отлично. Но ...

Я хочу добавить гораздо больше операций, и я разочарован тем, что каждая функция JScript для каждой операции точно такая же, как и все остальные, с небольшими, но существенными отличиями. Например, единственное различие между функциями sum (), sub (), mul () и div () заключается в соответствующих операторах: + = , - = , * = и / = . Остальная часть кода в этих четырех функциях повторяется на 100%.

Вопрос № 1 : Как я могу написать JScript более обобщенно, чтобы было меньше дублирующегося кода?

Вопрос № 2 : Как я могу заставить эту работу работать более чем с двумя входными массивами, в настоящее время [a] и [b]? Желательно, чтобы функции JScript op принимали динамическое число c массивов, например, для операции AVERAGE над входными массивами.

Мои навыки VB высоки. Мои JavaScript навыки не являются. Пожалуйста, помните, что код JavaScript должен быть по существу ES3.

Function ArrayOp(op, a, b)
    Static sc As Object

    If sc Is Nothing Then
        Set sc = CreateObject("ScriptControl")
        With sc
            .Language = "JScript"
            .AddCode "function jsArray(v){return new VBArray(v).toArray()}"
            .AddCode "function vbArray(t){for(var r=new ActiveXObject('Scripting.Dictionary'),e=0;e<t.length;e++)r.add(e,t[e]);return r.items()}"

            .AddCode "function sum(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]+=b[t];return vbArray(a);}"
            .AddCode "function sub(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]-=b[t];return vbArray(a);}"
            .AddCode "function mul(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]*=b[t];return vbArray(a);}"
            .AddCode "function div(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]/=b[t];return vbArray(a);}"
        End With
    End If

    ArrayOp = sc.Run(op, a, b)        
End Function
Sub Test()
    Dim a, b, c
    a = [a1:a999].Value2
    b = [b1:b999].Value2

    c = ArrayOp("div", a, b) '<~- c is now a VBA array of 999 elements with values = a / b
End Sub
...