У меня есть проблема, поэтому у меня есть объект JS с такими данными:
[
{
"key": "value"
},
{
"key": "value"
}
]
Я создал для каждого цикла:
data.forEach(obj => {
Object.entries(obj).forEach(([key, value]) => {
if (typeof value[key] !== 'undefined' || value[key] !== null) {
if (value[key].includes("value")) {
value[key] = "newvalue";
}
}
});
});
Но у меня всегда есть такие сообщения об ошибках:
ERROR: Cannot read property 'key' of null
ERROR: Cannot read property 'includes' of undefined
Заранее спасибо за помощь.
Поэтому я думаю, что должен объяснить свою цель. У меня есть этот объект JS, и я хочу, чтобы, если значение соответствует «foo», например, оно будет заменено на «бар».
Вот рабочий фрагмент кода:
const data = [
{
"key": "value"
},
{
"key": "value"
}
]
data.forEach(obj => {
Object.entries(obj).forEach(([key, value]) => {
if (typeof value[key] !== 'undefined' || value[key] !== null) {
if (value[key].includes("value")) {
value[key] = "newvalue";
}
}
});
});
Всего 1 ответ
Я думаю, вы не Object.entries
как Object.entries
работает Object.entries
. Вы должны взглянуть на документ MDN .
Чтобы помочь вам понять, что он делает, давайте выйдем из элементов массива, который вы перебираете, с помощью вашего forEach
:
someObject = { "someKey": "someValue" }
Object.entries(someObject).forEach(([key, value]) => {
console.log(`in "someObject", key "${key}" points to value "${value}" and can be accessed like so: someObject.${key}`)
})
// This logs out:
// in "someObject", key "someKey" points to value "someValue" and can be accessed with someObject.someKey
Object.entries
возвращает двумерный массив, где каждый элемент является парой ключ-значение.
В вашем примере кода вы пытаетесь получить доступ к value[key]
. Но value
- это просто строка "value"
которую указывает ваш ключ "key"
. Догадываясь о своем намерении, я думаю, что вы имели в виду доступ к obj[key]
для достижения "value"
(но вам на самом деле не нужно это делать, поскольку Object.entries
уже «извлек» для вас значение).
Возможно, вы видели другую функцию-прототип Object, используемую в другом месте, Object.keys
, и перепутали ее здесь. Это чаще всего видно, потому что это было вокруг намного дольше. Если бы вы использовали взамен Object.keys
, у вас фактически был бы доступ к ключам самостоятельно, что близко к тому, что вы здесь сделали.
Object.keys
возвращает одномерный массив только ключей объекта (см. Документы MDN ).
someObject = { "someKey": "someValue" }
Object.keys(someObject).forEach(key => {
console.log(`key "${key}" in object "someObject" points to value "${someObject[key]}"`)
})
// This logs out:
// key "someKey" in object "someObject" points to value "someValue"
Давайте перепишем ваш фрагмент с этими функциями. Вот с Object.entries
:
const data = [{
"key": "value"
}, {
"key": "value"
}]
data.forEach(obj => {
Object.entries(obj).forEach(([key, value]) => {
if (typeof value === 'string' && value.includes('value'))
obj[key] = "newvalue"
})
})
console.log(data)
// [ { key: 'newvalue' }, { key: 'newvalue' } ]
А вот с Object.keys
:
const data = [{
"key": "value"
}, {
"key": "value"
}]
data.forEach(obj => {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'string' && obj[key].includes('value'))
obj[key] = "newvalue"
})
})
console.log(data)
// [ { key: 'newvalue' }, { key: 'newvalue' } ]