Переместить в массив, если переменная была установлена

#javascript #arrays

#javascript #массивы

Вопрос:

Я думаю, что это относительно простая вещь, которую я пытаюсь сделать, но не уверен, как ее выполнить. По сути, у меня есть массив, в который я хочу поместить значение (родительское), ТОЛЬКО если это значение существует. Я пытаюсь выполнить это следующим образом, но это не компилируется. Я хочу устанавливать родительский индекс только в том случае, если для него есть значение, я не хочу parent: null

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

 array.push({
    id: id,
    name: name,
    parent ? parent: parent : null
})
  

Ответ №1:

Вы могли бы использовать amp;amp; оператор, сокращенные имена свойств и расширенный синтаксис, подобный этому

 array.push({
    id,
    name,
    ...(parent amp;amp; { parent })
})
  

Если parent равно нулю, amp;amp; оператор вернет значение null, а распространение значения null возвращает пустой объект. Если родительский элемент имеет значение, { parent } созданный объект будет распространен внутри объекта.

Примечание: при этом также будет пропущен parent ключ для всех falsy родительских значений, таких как 0 и "" . Но вы используете тернарный оператор на parent . Итак, я предполагаю, что эти значения недействительны.

Вот фрагмент:

 function create(parent) {
  console.log({
    id: 1,
    ...(parent amp;amp; { parent })
  })
}

[null, undefined, 5, "a string"].map(create)  

Комментарии:

1. Просто вопрос по этому поводу. Если parent является результатом функции, как мне установить parent для результата этой функции? Если я буду следовать приведенному выше синтаксису, я получу, что parent не определен.

2. Я не понял вашего вопроса. Можете ли вы создать скрипку? parent Создана ли переменная и доступна ли она в этой области?

3. Не самая лучшая скрипка, но по сути: jsfiddle.net/jxwba82p Предположим, что значение parent изменится, и иногда функция вернет null

4. @Nouman вы можете разрушить массив, возвращаемый функцией, до 2 переменных const [parentId, parentName] = getParent(parent) ?? [] и добавить ключи условно jsfiddle.net/adigas/ymgqnhxv/1

Ответ №2:

Я думаю, вы можете использовать функцию Object.assign следующим образом

 array.push(Object.assign({
    id: id,
    name: name,
}, parent ? {parent} : {}))
  

Будьте осторожны с ложными значениями.

Ответ №3:

Вы можете использовать многоточие.

 array.push({
    id: id,
    name: name,
    ...(parent ? {parent: parent} : {})
});
  

Комментарии:

1. Почему бы просто не {parent} ? и я думаю, что вы имели в виду spread operator .

2. И что, если родительский параметр установлен в 0?

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

4. Или ни одно из допустимых значений не является ложным — например, 0 может не быть допустимым родительским идентификатором.

5. С кодом вы правы. Но OP говорит: want to push a value (parent) ONLY if that value exists. и если установлено значение 0, это для меня установлено.

Ответ №4:

Вы можете попробовать что-то вроде этого

 let obj = {
  id: "id",
  name: "name",
  parent: null
}


let obj1 = {
  id: "id",
  name: "name",
  parent: "parent"
}



const array = [

  ...obj.parent ? [obj] : [],
];

const array2 = [

  ...obj1.parent ? [obj1] : [],
];


console.log(array)
console.log(array2)  

Ответ №5:

 let obj = {
    id: id,
    name: name
};

if (parent !== undefined)
    obj.parent = parent;

array.push(obj);