JS: цикл по строке и добавление объекта со значением этих слов (один к одному) в массив объектов

#javascript #arrays #loops #object

#javascript #массивы #циклы #объект

Вопрос:

Я получил строку (теги var), ее слова разделены запятой

 var msg ='#yeah alter #wow #cool dadadda'

function listTags(){
if(!tagsss.some(r=> msg.indexOf(r) >= 0))
    (tagsss).push(msg.match(/#w /g).map(v => v.replace('#', '')))
return (msg.match(/#w /g).map(v => v.replace('#', '')))
}
var tags = listTags().toString() // result: yeah,wow,cool
  

И я получил массив объектов

 var arrOfObj = [
     { key: 'Sarah', value: 'Sarah' },
     { key: 'Evan', value: 'Evan' },
     { key: 'Adam', value: 'Adam' }
 ]
  

Как я могу выполнить цикл через мою строку и создать для каждого слова новый объект внутри моего arrOfObj. Итак, для каждого отдельного слова (давайте назовем его x ) я хотел бы добавить такой объект:
{key: x, value: x }

Итак, в моем примере результат после первого цикла будет

 var arrOfObj = [
     { key: 'Sarah', value: 'Sarah' },
     { key: 'Evan', value: 'Evan' },
     { key: 'Adam', value: 'Adam' },
     { key: 'yeah', value: 'yeah' }
 ]
  

(Если кто-то знает лучший способ фильтрации хэштегов, дайте мне знать, но моя главная забота — это то, что я упомянул выше, заранее большое спасибо)

Комментарии:

1. Какова цель иметь объект с двумя свойствами с одинаковым значением? Вам следует отредактировать свой вопрос, добавив в него более подробную информацию.

2. это из-за определенного плагина, в котором вы можете отличаться между отображаемым значением и фактическим значением. Я не хочу, чтобы они отличались, но плагину требуются они оба (ключ и значение).

Ответ №1:

В более новых браузерах вы можете искать за # , сопоставлять массив строк с массивом объектов, а затем просто concat использовать исходный массив:

 var arrOfObj = [
     { key: 'Sarah', value: 'Sarah' },
     { key: 'Evan', value: 'Evan' },
     { key: 'Adam', value: 'Adam' }
 ];

var msg ='#yeah alter #wow #cool dadadda';
const result = arrOfObj.concat(
  msg
    .match(/(?<=#)w /g)
    .map(key => ({ key, value: key }))
);
console.log(result);  

Комментарии:

1. Большое спасибо, вы знаете, как я мог бы предотвратить вставку уже существующего объекта?

2. Лучшим способом было бы использовать объект, проиндексированный key вместо массива, а затем сначала проверить, obj[key] существует ли — чтобы превратить этот объект обратно в массив, вызовите Object.values его.

Ответ №2:

Я действительно не вижу смысла повторять одно и то же значение с двумя разными ключами для каждого объекта, но вы можете легко достичь этого с помощью функции отображения массива JS:

     var tags = 'banana,pineapple,passionfruit,durian,jackfruit';
    var arrOfObj = [ { key: 'Sarah', value: 'Sarah' },
                     { key: 'Evan', value: 'Evan' },
                     { key: 'Adam', value: 'Adam' } ];
    var objArr = tags.split(',').map( a => {
	                return {key: a, value: a};
                 });
    
    console.log(arrOfObj.concat(objArr))  

Комментарии:

1. спасибо, это из-за определенного плагина, где вы можете отличаться между отображаемым значением и фактическим значением. Я не хочу, чтобы они отличались, но плагину требуются они оба (ключ и значение). Знаете ли вы, как я мог бы предотвратить вставку уже существующего объекта?