JavaScript возвращает другой объект, если строка массива соответствует значению свойства объекта

У меня есть простой массив строковых идентификаторов и объектов, и при начальной загрузке я сопоставляю это 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
    }

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

CBroe 03.04.2023 12:24

Почему в желаемом выводе появляется 743157? Это не соответствует: «Как я могу получить объект, чье проверенное свойство истинно, НО это не должны быть начальные два объекта с проверенным как истинное».

Ben Stephens 03.04.2023 13:28

@BenStephens Я проверил первые два идентификатора: true ('743156', '743157'), теперь я снимаю флажок 743156 (сделать отмеченным как ложный) и сделать 743158 проверенным как истинный. Я не касаюсь 743157, это правда с самого начала, поэтому желаемый o/p должен быть таким, как указано выше. Единственное условие - я не должен получать уже начальные проверенные значения

Mitul Panchal 03.04.2023 13:34

Но 743157 — это одно из начальных проверенных значений?

Ben Stephens 03.04.2023 13:43

@BenStephens yes sir ['743156', '743157'] являются исходными проверенными значениями

Mitul Panchal 03.04.2023 13:44

Возможно, у меня ошибка понимания, но для меня «Единственное условие: я не должен получать уже начальные проверенные значения», а 743157 является одним из начальных проверенных значений, что означает, что 743157 не должно быть в выводе.

Ben Stephens 03.04.2023 13:46

@BenStephens Уже «начальные проверенные значения являются эксклюзивными «743156» и «743157». Любое из них может быть в сочетании с другими идентификаторами, такими как 743157 и 743158, как я упоминал выше, только для примера.

Mitul Panchal 03.04.2023 13:48

Ладно... кажется, я понял. Что вам нужно, так это список проверенных элементов, за исключением случая, когда список проверенных идентификаторов будет иметь те же значения, что и начальные проверенные значения. то есть вам нужен новый список проверенных значений, если ничего не изменилось с прошлого раза.

Ben Stephens 03.04.2023 13:57

@BenStephens Идеально

Mitul Panchal 03.04.2023 13:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
86
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете просто использовать метод 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)

Array.prototype.filter()

Нет, это не то, что я хочу, это два начальных проверенных значения, пожалуйста, посмотрите на мой вопрос

Mitul Panchal 03.04.2023 12:41

фильтровать обновленный arrObj после внесения пользователем изменений.

constqwerty 03.04.2023 12:53

Можно поподробнее на примере

Mitul Panchal 03.04.2023 13:27

используйте метод фильтра после метода карты, который вы используете, чтобы проверить или снять отметку с определенных объектов с идентификаторами. вы можете связать его, если хотите map().filter()

constqwerty 03.04.2023 13:59

Чтобы опустить первые два объекта, имеющие идентификаторы массива 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);

Это работает частично, это всегда будет опускать первые два объекта и давать мне другие отмеченные объекты. Если я сделаю первое ложным, а третье истинным, это не даст мне второе и третье, а только третье.

Mitul Panchal 03.04.2023 13:13

Это решение будет работать в соответствии с массивом идентификаторов, любые идентификаторы, которые вы передаете в этом массиве, будут опущены! Поэтому, если вы передадите идентификаторы 1-го и 3-го, тогда код пропустит 1-й и 3-й и проверит.

Hetal N 03.04.2023 13:22
Ответ принят как подходящий

Здесь функция 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 при неизменном, иначе неизмененные и не отмеченные элементы были бы неразличимы.

Другие вопросы по теме