Проблемы в forEach для Javascript объекта - PullRequest
0 голосов
/ 15 января 2020

У меня проблема, поэтому у меня есть JS объект с такими данными:

[
  {
    "key": "value"
  },
  {
    "key": "value"
  }
]

Я создал для каждого l oop:

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 Object, и я хочу, чтобы, если значение, например, соответствует «foo», оно будет заменено на «bar».


Вот рабочий фрагмент кода:

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 Ответ

0 голосов
/ 15 января 2020

Я думаю, вы не понимаете, как именно работает Object.entries. Вы должны взглянуть на MDN do c.

Чтобы помочь вам увидеть, что он делает, давайте выйдем из элементов массива, который вы перебираете с помощью 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' } ]
...