Если вы используете Angular CLI, это очень просто (проверено на CLI RC.0):
src / polyfills.ts
declare global {
interface Window {
myCustomFn: () => void;
}
}
my-custom-utils .ts
window.myCustomFn = function () {
...
};
Я использую IntelliJ, поэтому мне также нужно было изменить следующую настройку в среде IDE до того, как мои новые полипы забрали:
> File
> Settings
> Languages & Frameworks
> TypeScript
> check 'Use TypeScript Service'.
Вам просто нужно изменить ключевое слово in
на ключевое слово of
. Не является for..in
, чем for..of
.
arr.values()
возвращает итератор, который должен быть повторен с ключевым словом of
.
Кроме того, если product = 0
, то все ваши умножения вернут 0.
Кстати, этот код подвержен ошибкам, потому что вы не проверяете текущий индекс, но вы проверяете, отличается ли умножаемое вами значение от текущего значения. Это приведет к проблеме, если в массиве будет продублировано одинаковое число.
И теперь, говоря о передовой практике, немного странно, что сначала вы перебираете массив с циклом for(var i...
, а во второй раз - с for...in/of
.
Я исправил код для вас:
function getProducts(arr) {
let products = [];
for(let i = 0; i < arr.length; i++) {
let product = 1;
for(let ii = 0; ii < arr.length; ii++) {
if(i != ii) {
product *= arr[ii];
}
}
products.push(product);
}
return products;
}
Пояснение: замените число в i на 1 , чтобы оно не мешало умножению. Кроме того, примените заполнение к копии из a , следовательно, [... a]
[111 ]
console.log( [2,3,4,5].map( (n,i,a) => [...a].fill(1,i,i+1).reduce( (a,b) => a*b ) ) )
Лучший способ сделать это - получить общий продукт и использовать map()
для деления total
на каждое значение
function getProducts(arr){
let total = arr.reduce((ac,a) => ac * a,1);
return arr.map(x => x === 0 ? total : total/x);
}
console.log(getProducts([1, 7, 3, 4]))
[118 ] Вы можете взять произведение всех чисел и поделить на номер индекса, чтобы получить произведение всех, кроме действительного значения.
function getProducts(array) {
var product = array.reduce((a, b) => a * b, 1);
return array.map(p => product / p);
}
console.log(getProducts([1, 7, 3, 4]));
Более надежный подход с массивом с одним нулем. Если массив имеет более одного нуля, все продукты равны нулю.
Приведенный ниже подход заменяет значение индекса на единицу.
function getProducts(array) {
return array.map((_, i, a) => a.reduce((a, b, j) => a * (i === j || b), 1));
}
console.log(getProducts([1, 7, 0, 4]));
console.log(getProducts([1, 7, 3, 4]));