javascript根据条件从嵌套的对象数组返回属性值

时间:2018-05-07 09:31:41

标签: javascript arrays multidimensional-array ecmascript-6

我有一个对象数组,其中每个对象都可以有一个对象数组。

var mylist = [
    {
        "email" : null, 
        "school" : "schoolA",
        "courses": [
            {
                "name" : 'ABC', 
                "type" : "chemistry"
            }, 
            {
                "name" : 'XYZ',
                "type": "math"
            }
        ]
    }, 
    {
        "email" : null,
        "school": "schoolB"
    }
];

如果课程类型之一是化学,我想返回课程名称。 课程类型是独一无二的,即使它们有些重复,我们也会返回第一个。

var result = mylist.some(function (el) {
            el.courses && el.courses.some(function(u) {
              if (u.type === 'chemistry') {
                 return u.name;
              };    
            })
        });

console.log('outcome:', result);  

我的代码在这个阶段没有工作。

2 个答案:

答案 0 :(得分:3)

some回调应该返回一个truthy或falsy值,告诉some是否继续(true =停止),some返回一个布尔值,而不是回调返回值。

在这种情况下,最简单的方法就是直接分配到result

var result;
mylist.some(function(el) {
    return (el.courses || []).some(function(course) {
        if (course.type === "chemistry") {
            result = course.name;
            return true;
        }
        return false;
    });
});

直播示例:



var mylist = [
    {
        "email" : null, 
        "school" : "schoolA",
        "courses": [
            {
                "name" : 'ABC', 
                "type" : "chemistry"
            }, 
            {
                "name" : 'XYZ',
                "type": "math"
            }
        ]
    }, 
    {
        "email" : null,
        "school": "schoolB"
    }
];

var result;
mylist.some(function(el) {
    return (el.courses || []).some(function(course) {
        if (course.type === "chemistry") {
            result = course.name;
            return true;
        }
        return false;
    });
});
console.log(result);




我坚持使用ES5语法,因为你没有在你的问题中使用任何ES2015 +,但在ES2015 +中,最简单的可能是使用嵌套的for-of循环:

let result;
outer: for (const el of mylist) {
    for (const course of el.courses || []) {
        if (course.type === "chemistry") {
            result = course.name;
            break outer;
        }
    }
}

直播示例:



const mylist = [
    {
        "email" : null, 
        "school" : "schoolA",
        "courses": [
            {
                "name" : 'ABC', 
                "type" : "chemistry"
            }, 
            {
                "name" : 'XYZ',
                "type": "math"
            }
        ]
    }, 
    {
        "email" : null,
        "school": "schoolB"
    }
];

let result;
outer: for (const el of mylist) {
    for (const course of el.courses || []) {
        if (course.type === "chemistry") {
            result = course.name;
            break outer;
        }
    }
}
console.log(result);




答案 1 :(得分:2)

您可以使用classpath 'com.google.gms:google-services:3.3.0' 方法迭代数组中的每个对象,然后使用reduce()方法查找某些课程是否与类型匹配。

find()