Переименовать вложенный ключ в массиве объектов JS - PullRequest
0 голосов
/ 21 марта 2020

Используя JS я пытаюсь переименовать canBook -> quantity, variationsEN -> variations и вложенные ключи valueEN -> value

var prod = [{
    price: 10,
    canBook: 1
}, {
    price: 11,
    canBook: 2,
    variationsEN: [{
        valueEN: 1
    }, {
        valueEN: 2
    }]
}]

Мне удалось переименовать ключи, но я понятия не имею, как переименовать вложенные: valueEN

prod.map(p => ({
    quantity: p.canBook, variations:p.variationsEN
}))

Ответы [ 4 ]

1 голос
/ 21 марта 2020

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

function rename(value) {
    if (!value || typeof value !== 'object') return value;
    if (Array.isArray(value)) return value.map(rename);
    return Object.fromEntries(Object
        .entries(value)
        .map(([k, v]) => [keys[k] || k, rename(v)])
    );
}

var keys = { canBook: 'quantity', variationsEN: 'variations', valueEN: 'value' },
    prod = [{ price: 10, canBook: 1 }, { price: 11, canBook: 2, variationsEN: [{ valueEN: 1 }, { valueEN: 2 }] }],
    result = rename(prod);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 21 марта 2020

Просто примените тот же трюк снова. Замените:

variations:p.variationsEN

на:

variations:(p.variationsEN || []).map(q => ({ value: q.valueEN }))

Дополнительная || [] предназначена для случаев, когда свойство не существует в исходном объекте. В этом случае для него создается пустой массив.

0 голосов
/ 21 марта 2020

Если это действительно JSON (как, по-видимому, указывает ваш тег), например, вы получаете его в виде строки с сервера, вы можете использовать функцию reviver , например:

var prod = JSON.parse(prodJSON, function (k, v) {
 if (k === "canBook") {
   this["quantity"] = v
 } else {
   return v
 }
});

(Конечно, вы всегда можете привести в порядок, если вы начинаете с JS объекта, а не со строки JSON, но в этом случае это будет перебор)

0 голосов
/ 21 марта 2020
variations:p.variationsEN.map(q => { value: q.valueEN })
...