У меня есть простой массив строковых идентификаторов и объектов, и при начальной загрузке я сопоставляю это Ids
с этим объектом и делаю свойство checked
для true
const Ids = ['743156', '743157']
[
{
"id": "743156",
"role": "Authorized Redistributor (AR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743157",
"role": "System Of Record (SOR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743158",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743159",
"role": "System Of Record (SOR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743976",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
]
Теперь у пользователя есть возможность обновить, установив флажки, сделав checked
истинным, что может сделать другие Ids
проверенные свойства истинными. Как я могу получить объект, чье свойство checked
истинно, НО это не должны быть начальные два объекта с проверкой как истина.
Так, например, я снимаю флажок с идентификатором 743156
и проверяю 743158
, я должен получить два объекта ниже, и если пользователь не установил какой-либо НОВЫЙ флажок, он должен вернуть меня с пустым объектом {}, а не с начальными отмеченными флажками с идентификаторами 743156 & 743157
с отмеченным значением true
{
"id": "743157",
"role": "System Of Record (SOR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743158",
"role": "Authorized Redistributor (AR)",
"checked": true,
"checkBoxPatched": true
}
Почему в желаемом выводе появляется 743157? Это не соответствует: «Как я могу получить объект, чье проверенное свойство истинно, НО это не должны быть начальные два объекта с проверенным как истинное».
@BenStephens Я проверил первые два идентификатора: true ('743156', '743157'), теперь я снимаю флажок 743156 (сделать отмеченным как ложный) и сделать 743158 проверенным как истинный. Я не касаюсь 743157, это правда с самого начала, поэтому желаемый o/p должен быть таким, как указано выше. Единственное условие - я не должен получать уже начальные проверенные значения
Но 743157 — это одно из начальных проверенных значений?
@BenStephens yes sir ['743156', '743157'] являются исходными проверенными значениями
Возможно, у меня ошибка понимания, но для меня «Единственное условие: я не должен получать уже начальные проверенные значения», а 743157 является одним из начальных проверенных значений, что означает, что 743157 не должно быть в выводе.
@BenStephens Уже «начальные проверенные значения являются эксклюзивными «743156» и «743157». Любое из них может быть в сочетании с другими идентификаторами, такими как 743157 и 743158, как я упоминал выше, только для примера.
Ладно... кажется, я понял. Что вам нужно, так это список проверенных элементов, за исключением случая, когда список проверенных идентификаторов будет иметь те же значения, что и начальные проверенные значения. то есть вам нужен новый список проверенных значений, если ничего не изменилось с прошлого раза.
@BenStephens Идеально
вы можете просто использовать метод filter() в JS
const arrObj = [
{
"id": "743156",
"role": "Authorized Redistributor (AR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743157",
"role": "System Of Record (SOR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743158",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743159",
"role": "System Of Record (SOR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743976",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
]
const filterdData = arrObj.filter((_obj)=> _obj.checked === true);
console.info(filterdData)
Нет, это не то, что я хочу, это два начальных проверенных значения, пожалуйста, посмотрите на мой вопрос
фильтровать обновленный arrObj после внесения пользователем изменений.
Можно поподробнее на примере
используйте метод фильтра после метода карты, который вы используете, чтобы проверить или снять отметку с определенных объектов с идентификаторами. вы можете связать его, если хотите map().filter()
Чтобы опустить первые два объекта, имеющие идентификаторы массива ids соответственно, и получить проверенные значения,
const data = [
{
"id": "743156",
"role": "Authorized Redistributor (AR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743157",
"role": "System Of Record (SOR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743158",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743159",
"role": "System Of Record (SOR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743976",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
}
];
const ids = ["743156", "743157"];
const checkedArr = [];
data.map((d) => {
if (!ids.includes(d.id) && d.checked === true) {
checkedArr.push(d);
}
})
console.info(checkedArr);
Это работает частично, это всегда будет опускать первые два объекта и давать мне другие отмеченные объекты. Если я сделаю первое ложным, а третье истинным, это не даст мне второе и третье, а только третье.
Это решение будет работать в соответствии с массивом идентификаторов, любые идентификаторы, которые вы передаете в этом массиве, будут опущены! Поэтому, если вы передадите идентификаторы 1-го и 3-го, тогда код пропустит 1-й и 3-й и проверит.
Здесь функция same_ids_lists
используется для проверки того, были ли какие-либо изменения в проверяемых элементах. Возможно, нет необходимости сортировать и копировать массивы списков, если они всегда будут в одном и том же порядке.
const ids = ['743156', '743157'];
const data = [
{
"id": "743156",
"role": "Authorized Redistributor (AR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743157",
"role": "System Of Record (SOR)",
"checked": true,
"checkBoxPatched": true
},
{
"id": "743158",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743159",
"role": "System Of Record (SOR)",
"checked": false,
"checkBoxPatched": true
},
{
"id": "743976",
"role": "Authorized Redistributor (AR)",
"checked": false,
"checkBoxPatched": true
},
];
const same_ids_lists = (list_1, list_2) =>
[...list_1].sort().join('-') === [...list_2].sort().join('-');
const get_new_checked_if_changed = (data, last_ids) => {
const checked = data.filter( (item) => item.checked );
const is_unchanged = same_ids_lists(
checked.map( (item) => item.id ),
last_ids
);
return is_unchanged ? false : checked;
};
console.info('When unchanged: ', get_new_checked_if_changed(data, ids));
data[0].checked = false;
data[2].checked = true;
console.info('When changed: ', get_new_checked_if_changed(data, ids));
Редактировать: изменено get_new_checked_if_changed
, чтобы возвращать false при неизменном, иначе неизмененные и не отмеченные элементы были бы неразличимы.
Можете ли вы показать нам, что вы пробовали до сих пор, пожалуйста?