Произведение всех других чисел в массиве

Если вы используете 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'.
0
задан Gerard Way 11 March 2019 в 14:09
поделиться

4 ответа

Вам просто нужно изменить ключевое слово 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;
}
0
ответ дан Jorge Fuentes González 11 March 2019 в 14:09
поделиться

Пояснение: замените число в 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 ) ) )

0
ответ дан gkelly 11 March 2019 в 14:09
поделиться

Лучший способ сделать это - получить общий продукт и использовать 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 ]

0
ответ дан Maheer Ali 11 March 2019 в 14:09
поделиться

Вы можете взять произведение всех чисел и поделить на номер индекса, чтобы получить произведение всех, кроме действительного значения.

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

0
ответ дан Nina Scholz 11 March 2019 в 14:09
поделиться
Другие вопросы по тегам:

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