Проблемы в forEach объекта Javascript

У меня есть проблема, поэтому у меня есть объект 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' } ]


Есть идеи?

10000