ES6 spread元素 - 默认值

时间:2018-04-14 00:47:09

标签: javascript ecmascript-6

如果我传入的数组为空,我需要将一个空对象设置为默认值。类似的东西:

var obj = { documents: [...question.documents] || [{}] }

我使用条件修复它,但我想知道是否有更好的方法来实现它。

if(obj.documents.length === 0) obj.documents.push({})

4 个答案:

答案 0 :(得分:1)

因为即使是空阵列也是真的,我认为除了在某处进行明确的测试之外,没有任何优秀的解决方案。但是,三元组比if语句更简洁:

const question = { documents: [] };
const { documents } = question;
const obj = { documents: documents.length !== 0 ? documents : [{}]}
console.log(JSON.stringify(obj));

这是另一种可能性:

const question = { documents: [] };
const [firstElm = {}, ...otherElms] = question.documents;
const obj = { documents: [firstElm, ...otherElms] };
console.log(obj);

答案 1 :(得分:1)

有几种方法可以在单个表达式

中编写它

使用三元运算符:

var obj = { documents: [question.documents[0] || {}, ...question.documents.slice(1)] };

使用默认值

.underline-link:after {
 background-color: #0982ae
 }
.underline-link:hover {
color: #0982ae
}
.underline-link:after {
content: "";
height: 1px;
left: 0;
opacity: 0;
pointer-events: none;
position: absolute;
top: 100%;
transform: translateY(1px);
transition: all .15s cubic-bezier(.39, .575, .565, 1);
transition-property: opacity, transform;
width: 100%
}
.underline-link:focus {
outline: none
}


.underline-link {
font-family: -apple-system, BlinkMacSystemFont, segoe ui, avenir next, 
avenir, helvetica neue, helvetica, ubuntu, roboto, noto, arial, sans-serif;
-webkit-font-smoothing: subpixel-antialiased;
text-decoration: underline;
color: #b3b3b3;
cursor: pointer;
position: relative;
display: inline-block;
color: #087096;
font-size: 14px;
font-weight: 400;
text-decoration: none;
-moz-osx-font-smoothing: grayscale
}
.underline-link:hover {
text-decoration: none
}
.underline-link:focus:after, .underline-link:hover:after {
opacity: 1;
transition-delay: .2s;
transition-duration: .15s;
transform: translateY(-3px) translateZ(0)
}

在这两种情况下,由于不得不多次引用来源而产生一些尴尬

答案 2 :(得分:1)

  

spread运算符用在空数组中。我没看到   指出在这里使用点差运算符。目标可以实现   使用以下内容。

var obj = { documents: question.documents.length ? question.documents : [{}]}

如果正在使用您提供的方法,则不需要or子句,因为空数组也返回truthy值。所以它可以写成如下: -

var obj = { documents: question.documents }
if(!obj.documents.length) obj.documents.push({})

答案 3 :(得分:0)

这应该适合......

const question = {
  documents: [],
};

const obj = { 
  documents: [].concat(question.documents.length ? question.documents : {}) 
};

console.log(obj);