#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);