Найти вложенный объект внутри множества объектов на основе строки - PullRequest
2 голосов
/ 30 января 2020

У меня есть массив объектов, в котором мне нужно найти объект, значение которого совпадает со значением строки. Я пробовал это, и это работает.

Но есть ли способ оптимизировать его без использования карты?

Код:

const arr = [{
    label: 'A',
    options: [{
        label: 'abc',
        value: 'abc'
      },
      {
        label: 'bcd',
        value: 'bcd'
      }
    ]
  },
  {
    label: 'B',
    options: [{
        label: 'cde',
        value: 'cde'
      },
      {
        label: 'def',
        value: 'def'
      }
    ]
  },
  {
    label: 'C',
    options: [{
        label: 'efg',
        value: 'efg'
      },
      {
        label: 'fgh',
        value: 'fgh'
      }
    ]
  }
];
const str = 'cde';
const result = arr.map(obj => obj.options.find(item => item.value === str)).find(val => val !== undefined);
console.log('result', result);

Ответы [ 5 ]

3 голосов
/ 30 января 2020

Да, вам не нужно или нужно map, за которым следует find. Просто al oop:

let result;
for (const obj of arr) {
    result = obj.options.find(({value}) => value === str);
    if (result) {
        break;
    }
}

Live Пример:

const arr = [{
    label: 'A',
    options: [{
        label: 'abc',
        value: 'abc'
      },
      {
        label: 'bcd',
        value: 'bcd'
      }
    ]
  },
  {
    label: 'B',
    options: [{
        label: 'cde',
        value: 'cde'
      },
      {
        label: 'def',
        value: 'def'
      }
    ]
  },
  {
    label: 'C',
    options: [{
        label: 'efg',
        value: 'efg'
      },
      {
        label: 'fgh',
        value: 'fgh'
      }
    ]
  }
];
const str = 'cde';
let result;
for (const obj of arr) {
    result = obj.options.find(({value}) => value === str);
    if (result) {
        break;
    }
}
console.log('result', result);
1 голос
/ 30 января 2020

Можно принять Array#flatMap с пустым массивом в качестве значения по умолчанию.

Результатом является массив с совпадающим результатом.

const
    arr = [{ label: 'A', options: [{ label: 'abc', value: 'abc' }, { label: 'bcd', value: 'bcd' }] }, { label: 'B', options: [{ label: 'cde', value: 'cde' }, { label: 'def', value: 'def' } ] }, { label: 'C', options: [{ label: 'efg', value: 'efg' }, { label: 'fgh', value: 'fgh' }] }];
    str = 'cde';
    result = arr.flatMap(obj => obj.options.find(item => item.value === str) || []);

console.log('result', result);
0 голосов
/ 30 января 2020

найти в библиотеке подчеркивания позволит избежать использования карты в этом сценарии:

var myObj = _.find(arr, (obj) => {
    return _.find(obj.options, (elt) => elt.value === str);
});
0 голосов
/ 30 января 2020

В зависимости от ваших потребностей, вы можете сделать это:

const arr = [{ label: 'A', options: [{ label: 'abc', value: 'abc' }, { label: 'bcd', value: 'bcd' }] }, { label: 'B', options: [{ label: 'cde', value: 'cde' }, { label: 'def', value: 'def' } ] }, { label: 'C', options: [{ label: 'efg', value: 'efg' }, { label: 'fgh', value: 'fgh' }] }];

const re1 = /"value":"cde"/
const testStr = JSON.stringify(arr);
console.log(""+testStr)

console.log(re1.test(testStr)) // exists

const re2 = /"label":"(\w)+","value":"cde"/g

console.log(testStr.match(re2)) // label
0 голосов
/ 30 января 2020

вам не нужно использовать find внутри map, что составляет O(nk);

. Вы можете получить все options, а затем flat массив до find требуемого объект.

const arr = [{
	label: 'A',
	options: [{
			label: 'abc',
			value: 'abc'
		},
		{
			label: 'bcd',
			value: 'bcd'
		}
	]
},
{
	label: 'B',
	options: [{
			label: 'cde',
			value: 'cde'
		},
		{
			label: 'def',
			value: 'def'
		}
	]
},
{
	label: 'C',
	options: [{
			label: 'efg',
			value: 'efg'
		},
		{
			label: 'fgh',
			value: 'fgh'
		}
	]
}
];

const str = 'cde';
const result = arr.map(({options}) => options).flat().find(({value}) => value === str)
console.log('result', result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...