Добавить свойство в массив объекта, основываясь на существовании значения в другом массиве - PullRequest
0 голосов
/ 06 сентября 2018

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

const arrayToCheck = ['a', 'b', 'c', 'd'];

Вот основной массив,

const mainArray = [ {name:'alex', code: 'c'}, 
                    {name:'jack', code: 'd'}, 
                    {name:'john', code: 'n'}, 
                    {name:'mike', code: 'l'}
                  ]

Я хочу добавить свойство status с ключом 'enable' или 'disable' в mainArray на основе значений в arrayToCheck.

Таким образом, вывод должен быть

[ {name:'alex', code: 'c', status: 'enable'}, 
  {name:'jack', code: 'd', status: 'enable'}, 
  {name:'john', code: 'n', status: 'disable'}, 
  {name:'mike', code: 'l', status: 'disable'}
]

Я пробовал карту и некоторые, чтобы получить желаемый результат, но это не сработало,

Вот что я пробовал,

const output = this.mainArray.map( (fil, i) => {
          return arrayToCheck.some( s => {
            if (s === fil.Code) {
              this.mainArray[i].Status = 'enable'
            } else {
              this.mainArray[i].Status = 'disable'
            }
          })
        });

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Здесь легко понять код:

    const arrayToCheck = ['a', 'b', 'c', 'd'];
    const mainArray = [ {name:'alex', code: 'c'}, {name:'jack', code: 'd'}, {name:'john', code: 'n'}, {name:'mike', code: 'l'}]    
    const output = mainArray.map(obj => {
            obj.status = arrayToCheck.indexOf(obj.code) < 0 ? 'disable' : 'enable';
            return obj;
        })
    console.log(output);
0 голосов
/ 06 сентября 2018

Пара вещей там:

  1. JavaScript чувствителен к регистру . Code и code - это не одно и то же свойство.

  2. Вы ничего не возвращаете из своего map обратного вызова, поэтому map не правильный инструмент. Если вы просто хотите пройти через цикл, используйте цикл или forEach.

  3. Используйте возвращаемое значение , равное some, вместо выполнения if в своем обратном вызове. Но , здесь вам не нужно some, потому что вы можете использовать includes.

Предполагая, что вы хотите сделать то, что сделали в своем вопросе (измените существующие объекты вместо создания новых):

const arrayToCheck = ['a', 'b', 'c', 'd'];

const mainArray = [ {name:'alex', code: 'c'}, {name:'jack', code: 'd'}, {name:'john', code: 'n'}, {name:'mike', code: 'l'}];

mainArray.forEach(entry => {
    entry.status = arrayToCheck.includes(entry.code) ? "enable" : "disable";
});

console.log(mainArray);

Если вы хотите создать новые объекты, ответ Ненада покажет вам, как это сделать. Но я не понял этого из твоего вопроса.

0 голосов
/ 06 сентября 2018

Вы можете использовать map метод с includes и распространять синтаксис .... Это решение возвращает новый массив объектов и не изменяет исходный массив.

const arrayToCheck = ['a', 'b', 'c', 'd'];
const mainArray = [ {name:'alex', code: 'c'}, {name:'jack', code: 'd'}, {name:'john', code: 'n'}, {name:'mike', code: 'l'}]

const result = mainArray.map(e => ({...e, status: arrayToCheck.includes(e.code) ? "enable" : "disable"}))
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...