Size: a a a

JavaScript Noobs — сообщество новичков

2020 September 10

TS

Tim S in JavaScript Noobs — сообщество новичков
items.reduce(([acc,set],item)=>{if (item.opened){return [[...acc,item],set]}; if(set.has(item.id)){return [acc,set]}; set.add(item.id); return [[...acc,item],set]  },[[],new Set()])[0]
источник

ДИ

Дмитрий Иванов... in JavaScript Noobs — сообщество новичков
Ребят подскажите пожалуйста через какой метод проще здесь сделать проверку case SET_CURRENT_EDITOR_CODE:
 
return  {...state, code: state.code.concat([action.payload])} ? а то он может положить при клике одни и те же значения
источник

AG

Andrey Grek in JavaScript Noobs — сообщество новичков
jk
Если два одинаковых id, один с opened а другой без, то оставлять с opened?
Если несколько с opened то оставлять все?
На первый вопрос да, второй нет.
Смысл такой, что id должен быть всегда без повторений
источник

AG

Andrey Grek in JavaScript Noobs — сообщество новичков
Tim S
items.reduce(([acc,set],item)=>{if (item.opened){return [[...acc,item],set]}; if(set.has(item.id)){return [acc,set]}; set.add(item.id); return [[...acc,item],set]  },[[],new Set()])[0]
чёт сложна) попробовал, не убрал первый объект
источник

j

jk in JavaScript Noobs — сообщество новичков
Andrey Grek
На первый вопрос да, второй нет.
Смысл такой, что id должен быть всегда без повторений
Т.е. только один id но у opened true приоритет  над opened false?
источник

dr

dima reviakin in JavaScript Noobs — сообщество новичков
привет
подскажите пожалуйста, если кто-то видет более элегантное решение

на фото результат нужный

https://codepen.io/reviakin/pen/dyMmeQm
источник

AG

Andrey Grek in JavaScript Noobs — сообщество новичков
jk
Т.е. только один id но у opened true приоритет  над opened false?
прям лучше не скажешь, да!)
источник

j

jk in JavaScript Noobs — сообщество новичков
Andrey Grek
На первый вопрос да, второй нет.
Смысл такой, что id должен быть всегда без повторений
Оставлять можно произвольный элемент, главное чтобы только один?
источник

j

jk in JavaScript Noobs — сообщество новичков
Т.е. на порядок пофигу.
источник

AG

Andrey Grek in JavaScript Noobs — сообщество новичков
jk
Оставлять можно произвольный элемент, главное чтобы только один?
ага
источник

TS

Tim S in JavaScript Noobs — сообщество новичков
Тогда через мапу или объект надо делать вместо сета
источник

j

jk in JavaScript Noobs — сообщество новичков
const cache = {}
items.forEach(item => {
 if (!cache[item.id] || (item.opened && !cache[item.id].opened)) {
   cache[item.id] = item
 }
})

console.log(Object.values(cache))
источник

AG

Andrey Grek in JavaScript Noobs — сообщество новичков
jk
const cache = {}
items.forEach(item => {
 if (!cache[item.id] || (item.opened && !cache[item.id].opened)) {
   cache[item.id] = item
 }
})

console.log(Object.values(cache))
Идеально и элегантно) спасибо большое
источник

AG

Andrey Grek in JavaScript Noobs — сообщество новичков
jk
const cache = {}
items.forEach(item => {
 if (!cache[item.id] || (item.opened && !cache[item.id].opened)) {
   cache[item.id] = item
 }
})

console.log(Object.values(cache))
источник

М

Максим in JavaScript Noobs — сообщество новичков
Дмитрий Иванов
Ребят подскажите пожалуйста через какой метод проще здесь сделать проверку case SET_CURRENT_EDITOR_CODE:
 
return  {...state, code: state.code.concat([action.payload])} ? а то он может положить при клике одни и те же значения
через includes проверь пейлоад, если такого значения нет - обнови стейт
источник

ДИ

Дмитрий Иванов... in JavaScript Noobs — сообщество новичков
Максим
через includes проверь пейлоад, если такого значения нет - обнови стейт
можешь дать пример как это проверить в этом случае, сколько бъюсь не как не пойму
источник

М

Максим in JavaScript Noobs — сообщество новичков
Дмитрий Иванов
можешь дать пример как это проверить в этом случае, сколько бъюсь не как не пойму
Покажи как сейчас стейт устроен у тебя
источник

ДИ

Дмитрий Иванов... in JavaScript Noobs — сообщество новичков
import {DELETE_CURRENT_EDITOR_CODE, SET_CURRENT_EDITOR_CODE} from './actions';

const initialState = {
 code: []
};

export const codeReducer = (state = initialState, action) => {
 switch (action.type) {
   case SET_CURRENT_EDITOR_CODE:
     return  {...state, code: state.code.concat([action.payload])}
   case DELETE_CURRENT_EDITOR_CODE:
     return {...state, code: state.code.filter(i  => i.index !== action.payload)}
   default:
     return state
 }
}
источник

ДИ

Дмитрий Иванов... in JavaScript Noobs — сообщество новичков
после операций клика он заполняется так
источник

М

Максим in JavaScript Noobs — сообщество новичков
Дмитрий Иванов
import {DELETE_CURRENT_EDITOR_CODE, SET_CURRENT_EDITOR_CODE} from './actions';

const initialState = {
 code: []
};

export const codeReducer = (state = initialState, action) => {
 switch (action.type) {
   case SET_CURRENT_EDITOR_CODE:
     return  {...state, code: state.code.concat([action.payload])}
   case DELETE_CURRENT_EDITOR_CODE:
     return {...state, code: state.code.filter(i  => i.index !== action.payload)}
   default:
     return state
 }
}
if (!state.code.includes(action.payload)) {
 return  {...state, code: state.code.concat([action.payload])}
}

Примерно так.
источник