создание объектов - включить ключ, если значение установлено

1

Обычно я хочу создать такой объект:

const test = {
  key1: value1,
  key2: value2,
  key3: value3,
  key4: value4,
}

Однако, скажем, если value3 не undefined как я могу кратко опустить key3?

В настоящее время я делаю что-то вроде:

const test = {
  key1: value1,
  key2: value2,
  key4: value4,
}

if (value3) test.key3 = value3;

Но бывают ситуации, когда есть немало значений, которые могут быть undefined и поэтому мне интересно, есть ли способ просто не возвращать ключи, если значение не undefined чтобы избежать целой нагрузки условных выражений?

Теги:
object
javascript-objects

3 ответа

2
Лучший ответ

Вы можете использовать Object.keys с Array.reduce только для сбора значений, которые не определены:

const test = {
  key1: 'value1',
  key2: 'value2',
  key4: undefined,
}

const onlyPopulated = Object.keys(test).reduce((p, key) => {
  if (typeof test[key] !== 'undefined') {
    p[key] = test[key];
  }
  return p;
}, {});

console.log(onlyPopulated)
  • 0
    Это билет. Я не использовал, чтобы reduce() раньше. Хорошая вещь.
0

На практике я бы, вероятно, использовал технику, аналогичную тем, которые уже упоминались в других ответах. Однако, просто для удовольствия...

Если все значения в объекте можно безопасно преобразовать в JSON, то сжатым способом достижения желаемого результата будет использование stringify и parse:

var data = {
    key1: 'string',
    key2: 34,
    key3: undefined,
    key4: [{key: 'nested'}],
    key5: null
};

data = JSON.parse(JSON.stringify(data));

console.log(data);

JSON.stringify пропускает undefined, хотя он также пропускает другие типы значений, такие как функции. null все равно будет включен.

Разумеется, для тех, кто поддерживает код, не сразу станет ясно, зачем вы это делаете, они, скорее всего, предположили бы, что вы берете защитную копию, чтобы избежать проблем с ссылками.

0

Если вы можете использовать jQuery, вы можете использовать расширение, как показано ниже: http://api.jquery.com/jQuery.extend/

В основном, то, что расширяет, является слияние второго объекта, переданного в первый объект. Однако он не объединяет свойства null или undefined. Поэтому я думаю, что это будет хорошо подходит для вашего прецедента и будет довольно чистым.

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery.extend demo</title>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
 
<div id="log"></div>
 
<script>
var object1 = {
};
var test = {
    key1: 1,
    key2: 2,
    key3: undefined,
    key4: 4,
}
 
// Merge test into object1
$.extend( object1, test );
 
// Assuming JSON.stringify - not available in IE<8
$( "#log" ).append( JSON.stringify( object1 ) );
</script>
 
</body>
</html>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню