ES6展开运算符 - 默认值

3

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

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

我用一个条件修复了它,但是我想知道是否有更好的方法来实现这个目标。

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

不存在速度运算符这样的东西:https://dev59.com/pFoU5IYBdhLWcg3wvIuq#37152508 - Felix Kling
5个回答

1

有几种方法可以用单个表达式来编写此代码。

使用三元运算符:

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

使用默认值。
var obj = { documents: [question.documents[0] || {}, ...question.documents.slice(1)] };

在这两种情况下,都存在一些尴尬,因为需要多次引用源。

第二个重复项在展开数组时与第一个相同:https://jsfiddle.net/ks17peb2/ - CertainPerformance
@CertainPerformance 很好的发现,谢谢。我在一半的时候完全忘记了。已经修复! - Aluan Haddad

1
扩展运算符用于空数组内。我不明白在这里使用扩展运算符的意义。可以通过以下方式实现目标。
var obj = { documents: question.documents.length ? question.documents : [{}]}

如果使用您提供的方法,则不需要使用or子句,因为空数组也会返回真值。因此可以写成以下形式:-
var obj = { documents: question.documents }
if(!obj.documents.length) obj.documents.push({})

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


0

最短的方式

const  obj1 ={...(true&& {x:1})};
console.log(obj1)
const  obj2 ={...(false&& {y:1})};
console.log(obj2)


0

这应该适合...

const question = {
  documents: [],
};

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

console.log(obj);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接