【问题标题】:Simple way to loop through array of objects and compare results?遍历对象数组并比较结果的简单方法?
【发布时间】:2021-07-28 02:31:27
【问题描述】:

我有一个包含 15 个对象的数组,每个对象都包含一个键值对。如何循环遍历这个数组以检查每个对象中的键值对是否具有特定值,例如“是”?请记住,我已经循环了 25 个对象,并且每个对象中都有这个数组。

这是我的代码:

    let results = Object.keys(halls);
    let filtered = [];
    results.filter(key => {
        if (postcode == halls[key]['Location'][3]['Postcode'] && suburb == "") {return true;};

        arrayC.map((x) => {
            for (let i = 0; i < 15; i++) {
                if (halls[key]['Facility'][i][`${x}`] == "Yes") {return true;}
            };
        }); 
        return false;
    }).forEach(key => filtered.push([halls[key]]));

我认为问题可能在于我如何在 for 循环中返回 true,但我不确定。

感谢任何帮助! (不,我不能改变数据结构)

更新

工作代码:

        for (let a = 0; a < 15; a++) {
            let x = arrayC[a];
            for (let i = 0; i < 15; i++) {
                if (halls[key]['Facility'][i][`${x}`] == "Yes") {return true;}
            };
        }; 

【问题讨论】:

  • 您的直觉似乎是正确的:在map 回调中返回true 不会在filter 级别返回。如果您想这样做,请考虑使用for 循环
  • 您可以使用.every() 而不是内部.map,尽管您必须返回false,然后根据every 的值返回另一个。尼克建议的工作,你可以有你命名的循环来打破。您还可以设置外部布尔条件以根据需要中断以正确返回。

标签: javascript arrays object filter foreach


【解决方案1】:

首先将 15 项逻辑提取到单独的函数中。我们不使用map,而是使用every,因为您有兴趣查找;是否每一项的价值都是“是”。 (如果您只想查找某些项目的值为“是”,请切换everysome

EveryItemsValueIsYes(array, key){
    const elements = array.every(item => {
        for(let i=0; i<15; i++){
            if(halls[key]['Facility'][i][`${x}`] == "Yes"){
                return true;
            }
        }   
    });
    return elements.length > 0;
}

用函数替换内部数组映射代码。

也可以不用forEach结尾,而是用map替换,直接给filter赋值。

const filtered = results.filter((key) => {
if (postcode == halls[key]['Location'][3]['Postcode'] && suburb == "") {return true;}
    return EveryItemsValueIsYes(arrayC, key);
}).map(key => halls[key]);

【讨论】:

  • 我确实尝试过,但没有奏效 - 相反,我有一个 for 循环而不是地图(请参阅问题),但感谢有关 .every 的信息
猜你喜欢
  • 2021-08-15
  • 2021-10-13
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多