【问题标题】:javascript return property value from nested array of objects based on conditionjavascript根据条件从嵌套的对象数组中返回属性值
【发布时间】:2018-10-17 01:42:34
【问题描述】:

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

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

我的代码在这个阶段不起作用。

【问题讨论】:

  • 您必须使用find 函数找到正确的课程对象,然后返回找到的课程名称。函数some 只返回一个布尔值和给定谓词的值。

标签: javascript arrays multidimensional-array ecmascript-6


【解决方案1】:

some 回调应该返回一个真值或假值,它告诉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);

【讨论】:

    【解决方案2】:

    您可以使用reduce() 方法遍历数组中的每个对象,然后使用find() 方法查找某些课程是否匹配类型。

    var mylist = [{"email":null,"school":"schoolA","courses":[{"name":"ABC","type":"chemistry"},{"name":"XYZ","type":"math"}]},{"email":null,"school":"schoolB"}]
    
    const course = mylist.reduce((r, {courses}) => {
      if (courses && !r) {
        const course = courses.find(({type}) => type == 'chemistry');
        if (course) r = course.name;
      }
      return r;
    }, null)
    
    console.log(course)

    【讨论】:

    • 是的,reduce 继续运行,但至少 find 没有启动。
    • 是的,这是对剩余元素的真的快速回调。 :-)
    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2021-07-08
    • 1970-01-01
    • 2023-03-05
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多