Как разобрать сложный объект и массив по строке - PullRequest
0 голосов
/ 19 января 2019

У меня есть строка в переменной y , которая похожа на обычное уравнение синтаксического анализа, используемое в js для анализа объекта, и у меня есть сложный объект в переменной x . Теперь я хочу передать обе переменные в функцию с именем parser , и функция должна вернуть мне проанализированные данные из объекта. Если вам не понятен мой вопрос, посмотрите на мой пример, и вы будете кристально чисты.

var a = {data:{info:{name:'mina'},interested: ['programming','makeup']}}
function parse(x, y) { var y = y.split('.').reverse();
    for (var j = x, i = (y.length - 1); i >= 0; --i) { 
        j =  j !== undefined && j[y[i]] !== undefined ?j[y[i]] : false;
    }
    if (j) {
        return j;
    }
}
parse(a,'data.info.name') //output = mina
parse(a,'data.info')  //{name: "mina"}
parse(a,'data.interested[1]')

Эта функция лучше всего подходит для синтаксического анализа объекта, но мне не удалось проанализировать массив с помощью этой функции, я ищу решение, которое также может анализировать массив. Пожалуйста, помогите мне, я старался изо всех сил, я был в состоянии разобрать простой массив, как a.data.name [0] , но я не смог разобрать сложный массив, как a.data.name [0] [ 0] .name [0] (пример)

Пожалуйста, помогите Мне решить эту проблему

1 Ответ

0 голосов
/ 19 января 2019

Я думаю, это то, что вы ищете:

let a = {
  users: {
      user1: {
          name: 'Mina',
          interested: ['programming', 'makeup', 'get an answer'],
          complexArray: [['test1'], ['test2',{
              ultimateTest: ['success', 'more success']
          }]]
      },
      user2: {
          name: 'Ernesto',
          interested: ['give an answer']
      }
  }
};

function getContent(element, address) {

    let i, j;
    let x, y, z;
    let length1, length2;
    let currentPosition = element;

    address = address.split('.');
    length1 = address.length;

    for (i = 0; i < length1; i++) {
        x = address[i].match(/\[\d\]/g);
        if (x !== null) {
            // ARRAY TYPE ADDRESS
            y = address[i].replace(/\[\d\]/g, '');
            currentPosition = currentPosition[y];
            length2 = x.length;
            for (j = 0; j < length2; j++) {
                z = x[j].replace(/\D/g, '');
                z = parseInt(z);
                currentPosition = currentPosition[z];
            }
        } else {
            // OBJECT TYPE ADDRESS
            currentPosition = currentPosition[address[i]];
        }
    }

    return (currentPosition);

}

getContent(a, 'users.user1.interested[0]'); // OUTPUT: 'programming'
getContent(a, 'users.user2.name'); // OUTPUT: 'Ernesto'
getContent(a, 'users.user1.complexArray[1][1].ultimateTest[0]'); // OUTPUT: 'success'
getContent(a, 'users.user1.complexArray[1][1].ultimateTest[1]'); // OUTPUT: 'more success'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...