Node.js : Возвращает элементы, которые находятся между двумя определенными элементами в массиве

#javascript #node.js

Вопрос:

У меня есть текстовый массив и объект, а ключи объекта имеют эти значения массива:

 text = ['CALX' , 'ENTRY' , 43 , 44 , 'TAR' , 50 , 51 , 52 , 'OK', 'XX' , 'SL' , 12 , YYY]

obj = {
  entry : ['ENTRY' , 'ENTER' ,  'ENT'],
  target :['TARGET' , 'TP' , 'TAR' , 'TARGETS'],
  sl : ['STOP' , 'SLOSS' , 'SL' , 'SELL'],
}
 

Для упрощения :

word = текстовый элемент массива (например 'CALX' )

ключ = элемент массива значений объекта (например 'ENTRY' , или 'TP'

Итак, я хочу выполнить поиск в текстовом массиве, и если слово было равно ключу, вставьте элементы после слова в массив имен ключей в результирующем объекте, пока более поздний элемент в текстовом массиве не станет другим ключом или текущим ключом

например, из текстового массива и obj я хочу, чтобы этот вывод :

 result = {
    entry: [43 , 44],
    target: [50 , 51 , 52 , 'OK' , 'XX'],
    sl: [12 , 'YYY']
}
 

Это мой код, и я не знаю, как возвращает слова после текущего слова :

 text = ['CALX' , 'ENTRY' , 43 , 44 , 'TAR' , 50 , 51 , 52 , 'OK', 'XX' , 'SL' , 12 , YYY]

obj = {
  entry : ['ENTRY' , 'ENTER' ,  'ENT'],
  target :['TARGET' , 'TP' , 'TAR' , 'TARGETS'],
  sl : ['STOP' , 'SLOSS' , 'SL' , 'SELL'],
}

result = {
    entry: [43 , 44],
    target: [50 , 51 , 52 , 'OK' , 'XX'],
    sl: [12 , 'YYY']
}

  for (var i = 0; i < text.length; i  ) { 
    var word = text[i];
    for (var j = 0; j < Object.keys(obj).length; j  ) {
      var objKeys = Object.keys(obj); 
      var a = obj[objKeys[j]]; 
      for (var k = 0; k < a.length; k  ) {
        if (word == a[k]) {
           

        }
        }
      }
    }
  console.log(result);

 

Спасибо за вашу помощь

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

1. что происходит с 'CALX' ?

2. Игнорируйте это, возвращает элементы, только если они были после элементов entry , target или sel

Ответ №1:

Вы могли бы сохранить последний найденный тип.

 const
    text = ['CALX' , 'ENTRY' , 43 , 44 , 'TAR' , 50 , 51 , 52 , 'OK', 'XX' , 'SL' , 12 , 'YYY'],
    types = { entry : ['ENTRY' , 'ENTER' ,  'ENT'], target :['TARGET' , 'TP' , 'TAR' , 'TARGETS'], sl : ['STOP' , 'SLOSS' , 'SL' , 'SELL'] },
    result = {};
    
let type;

for (const item of text) {
    let temp = Object.keys(types).find(k => types[k].includes(item));
    if (temp) {
        type = temp;
        result[type] = result[type] || []; // newer: result[type] ??= [];
        continue;
    }
    if (type) result[type].push(item);
}

console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

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

1. Очень лаконично и чисто.

2. Что такое SyntaxError: Unexpected token '??='

3. это похоже на более раннюю версию js. пожалуйста , используйте отредактированную версию с логическим ИЛИ вместо логического нулевого присваивания ??= .

4. Вау, выглядит интересно.

Ответ №2:

Я обновил цикл для вашего использования.

 let text = ['CALX' , 'ENTRY' , 43 , 44 , 'TAR' , 50 , 51 , 52 , 'OK', 'XX' , 'SL' , 12 , 'YYY']

let obj = {
  entry : ['ENTRY' , 'ENTER' ,  'ENT'],
  target :['TARGET' , 'TP' , 'TAR' , 'TARGETS'],
  sl : ['STOP' , 'SLOSS' , 'SL' , 'SELL'],
}

let expectedResult = {
    entry: [43 , 44],
    target: [50 , 51 , 52 , 'OK' , 'XX'],
    sl: [12 , 'YYY']
}
let result = {}

//to reduce loops intially creating a temp array
let tempArr = []
for(key in obj) {
 tempArr =  [...tempArr, ...obj[key]] 
}

for(key in obj) {
  result[key] = []
  for(let i=0; i< obj[key].length; i  ) {
    let matchFound = false
    for(let j =0; j<text.length; j  ) {
      if(text[j] == obj[key][i]) {
        matchFound = true
      }
      if(matchFound amp;amp; tempArr.indexOf(text[j]) == -1) {
        result[key].push(text[j])
      }
      if(matchFound amp;amp; tempArr.indexOf(text[j 1]) != -1) {
        break;
      }
    }
  }
}
console.log(result)