使用ES6语法在.map()中添加条件检查时出错

时间:2016-06-06 13:19:27

标签: javascript angularjs callback ecmascript-6

我只需要将包含iban值的对象分配给下面代码中的列表。我无法解决此问题。请帮助。

  this.ibanList = this.data.map(
        (value, index)=> (if(value && value.iban){'id': index, 'text': value.iban}));

数据中存在的值如下所示。

 "data": [
        {

            "id": "2c4cc5e8-d24d-11e4-8833-150bbf360367"
        },
        {
            "iban": "DE45765459080",
            "id": "2c4cc8ae-d24d-11e4-8833-150bbf360367"
        },
        {

            "iban": "DE3700333333",
            "id": "8a23995d-10d7-11e5-b819-2c44fd83fb24"
        }
    ]

5 个答案:

答案 0 :(得分:6)

两个问题:

  1. 箭头函数的缩写形式必须在=>的右侧只有表达式。你有一个if声明。 (在括号中,即使在箭头函数之外也不会在任何地方有效。)

  2. map始终使用返回值。您没有给“其他”案件提供任何返回值。

  3. 在这种特定情况下,您可以使用条件运算符;我将使用null作为“else”案例的返回值:

    this.ibanList = this.data.map(
        (value, index)=> (value && value.iban ? {'id': index, 'text': value.iban} : null));
    

    var data = [
      {"id": "2c4cc5e8-d24d-11e4-8833-150bbf360367"},
      {"iban": "DE45765459080", "id": "2c4cc8ae-d24d-11e4-8833-150bbf360367"},
      {"iban": "DE3700333333", "id": "8a23995d-10d7-11e5-b819-2c44fd83fb24"}
    ];
    var ibanList = data.map(
        (value, index)=> (value && value.iban ? {'id': index, 'text': value.iban} : null));
    console.log(ibanList);

    但请注意,结果将包含null个。如果您想要value && value.iban为真的那些,请在映射前使用filter

    this.ibanList = this.data
        .filter(value => value && value.iban)
        .map((value, index) => ({'id': index, 'text': value.iban}));
    

    var data = [
      {"id": "2c4cc5e8-d24d-11e4-8833-150bbf360367"},
      {"iban": "DE45765459080", "id": "2c4cc8ae-d24d-11e4-8833-150bbf360367"},
      {"iban": "DE3700333333", "id": "8a23995d-10d7-11e5-b819-2c44fd83fb24"}
    ];
    var ibanList = data
        .filter(value => value && value.iban)
        .map((value, index) => ({'id': index, 'text': value.iban}));
    console.log(ibanList);

    在这种情况下,我在映射之前使用了filter ,这意味着您用作index的{​​{1}}值可能会有所不同从原来的。如果你想要原始值,预过滤,你可以通过结合上述两种方法进行过滤:

    id

    this.ibanList = this.data
        .map((value, index)=> (value && value.iban ? {'id': index, 'text': value.iban} : null))
        .filter(value => value); // Removes the nulls
    

    真的是否意味着用索引替换var data = [ {"id": "2c4cc5e8-d24d-11e4-8833-150bbf360367"}, {"iban": "DE45765459080", "id": "2c4cc8ae-d24d-11e4-8833-150bbf360367"}, {"iban": "DE3700333333", "id": "8a23995d-10d7-11e5-b819-2c44fd83fb24"} ]; var ibanList = data .map((value, index)=> (value && value.iban ? {'id': index, 'text': value.iban} : null)) .filter(value => value); // Removes the nulls console.log(ibanList);值(id等)?如果没有,请将上面的"2c4cc5e8-d24d-11e4-8833-150bbf360367"替换为id: index

答案 1 :(得分:3)

尝试:

    
var data = [{id:1, text: "1", iban: 'foo'}, {id:2, text: "2", iban: 'bar'}, {id:10, text: 20}];
var ibanList = data.filter((value) => value && value.iban).map(
        (value, index) => ({'id': index, 'text': value.iban}));
console.log(ibanList);

答案 2 :(得分:1)

对于map,您需要始终返回一个值,因此要获得所需的结果,您需要先filter列表。

this.ibanList = this.data.filter(value => value && value.iban)
     .map((value, index) => ({id: index, text: value.iban}));

答案 3 :(得分:0)

无需地图过滤器组合。这可以通过O(n)时间的单个减少来完成。

var data = [{"id": "2c4cc5e8-d24d-11e4-8833-150bbf360367"},{"iban": "DE45765459080","id": "2c4cc8ae-d24d-11e4-8833-150bbf360367"},{"iban": "DE3700333333","id": "8a23995d-10d7-11e5-b819-2c44fd83fb24"}],
ibanList = data.reduce((p,c,i) =>  (c.iban && p.push({"id": i, "text": c.iban}),p),[]);
console.log(ibanList)

答案 4 :(得分:-1)

使用过滤器代替地图。

this.ibanList = this.data.filter((value, index) => {return value && value.iban});