Добрый вечер всем,

У меня есть массив, который содержит 24 символа

"hours": [
        "1",
        "1",
        "1",
        "1",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0",
        "0"
    ] 

Я хотел бы искать через другой массив индексов; например [2, 5, 9, 10]

Затем перейдите к позициям (первого массива) (2, 5, 9 и 10) первого массива и измените символ на эту позицию на «1», а остальную часть массива переместите на «0»

Может ли кто-нибудь направить меня?

Спасибо !

2
Miguelit0 19 Авг 2018 в 22:25

4 ответа

Лучший ответ

Решение:

var hours = ["1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
    positions = [2, 5, 9, 10];

for (var i = 0; i < hours.length; i++) {
  hours[i] = positions.includes(i) ? "1" : "0";   
}

console.log(hours);

// ["0", "0", "1", "0", "0", "1", "0", "0", "0", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]

Демонстрация: https://jsfiddle.net/gzynud0c/1/


Как указано в комментариях, вышеуказанное решение работает во всех основных браузеры, включая IE9 +, без использования транспилятора, такого как Babel или используя polyfill.

Следующее работает во всех браузерах.

for (var i = 0; i < hours.length; i++) {
  hours[i] = ~positions.indexOf(i) ? "1" : "0";   
}

Демонстрация: https://jsfiddle.net/s59jt870/3/

2
Martin Geldart 19 Авг 2018 в 20:28

Звучит так, будто вы хотите просмотреть все элементы первого элемента и элемента forEach, если его индекс в массиве индексов изменяет значение на 1, иначе 0, верно? , Вы можете почти перевести предложение в код:

let hours= [ "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ]
let indexes = [2, 5, 9, 10]

hours.forEach((item, index, self) => self[index] = indexes.includes(index) ? '1' : '0' )

console.log(hours)

Это мутирует исходный массив. Если вам нужен новый массив, вы можете сделать что-то похожее с map():

let hours= [ "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ]
let indexes = [2, 5, 9, 10]

// leave hours as is and create a new array
let newArray = hours.map((item, index, self) =>  indexes.includes(index) ? '1' : '0' )

console.log(newArray)

Если ваши массивы очень большие, это не будет эффективно, так как вы перебираете массив indexes с каждой итерацией. Если это так, вы можете преобразовать ваш массив indexes в нечто вроде set, который позволяет осуществлять поиск в постоянное время. В качестве альтернативы вы можете просто начать с массива нулей и установить их:

let hours= [ "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ]
let indexes = [2, 5, 9, 10]

let newHours = indexes.reduce((a, index) => (a[index] = '1', a), Array.from(hours).fill("0"))

console.log(newHours)
1
Mark Meyer 19 Авг 2018 в 21:18

Я чувствую, что самый простой подход заключается в том, чтобы сначала установить все значения массива hours (изменить или нет в зависимости от требований) на "0", а затем посетить только те места, которые мы должны установить {{X2 }} и установите его там!

indices.reduce((h,v)=>(h[v]="1") && h, hours.map(()=>"0"))

let hours = ["1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
    indices = [2, 5, 9, 10];

let res = indices.reduce((h,v)=>(h[v]="1") && h, hours.map(()=>"0"));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
Koushik Chatterjee 19 Авг 2018 в 21:23

С отсортированным массивом индексов вы можете взять для него индекс j и проверить индекс цикла i с этим значением, изменить индекс массива индексов и вернуть либо '1', либо {{X3} } .

var hours = ["1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
    indices = [2, 5, 9, 10],
    replaced = hours.map((j => (v, i) => indices[j] === i && ++j ? '1' : '0')(0));

console.log(replaced.join(' '));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 19 Авг 2018 в 19:58
51921107