Как использовать строку для поиска в массиве - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть строка, которую нужно оценить как код.Но как мне добиться этого, чтобы я мог искать в массиве эту строку?

Значения, которые вставляются в функцию, предопределены.Так что я могу только изменить функцию.

function setIn(a, b, c)
{
    console.log('Debug session 603 started')
    var x = ""

    b.forEach(function(element, i) {
        x = x + "['" + element + "']"
    });

    console.log(x)
    a[x] = c
    return a
}

setIn(
    {
        "a": "asdf", 
        "b": {
            "b1": "wrong",
            "b2": "asdf"
        }
    },
    ['b', 'b1'],
    "good"
)

Ожидается:

{ 
    "a": "asdf",
    "b": {
        "b1": "good",
        "b2": "asdf"
    }
}

Мой текущий результат:

{ 
    "a": "asdf",
    "b": {
        "b1": "wrong",
        "b2": "asdf"
    },
    "['b']['b1']": "good"
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы могли бы фактически установить новое значение внутри цикла forEach, когда вы обращаетесь к последнему key в массиве b.В противном случае вы можете пройти один уровень глубоко внутри объекта.

function setIn(a, b, c)
{
    console.log('Debug session 603 started');
    var x;

    b.forEach(function(element, i)
    {
        // If we are accessing the last key, assign c to it.
        // Else, access the new key.

        if (i === b.length - 1)
            (x || a)[element] = c;
        else
            x = (x || a)[element];
    });

    return a;
}

let res = setIn(
    {
      "a": "asdf", 
      "b": {"b1": "wrong", "b2": "asdf"}
    },
    ['b', 'b1'],
    "good"
);

console.log(res);
0 голосов
/ 01 февраля 2019

Одно из решений:

function setIn(a, b, c){
    var x = "a"
    b.forEach(function(element, i) {
        x = x + "['" + element + "']"
    });
    x = x + "= c";
    eval(x)
    return a
}

Это может быть не самым красивым, но, похоже, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...