如何按某个值过滤JSON对象?

问题描述 投票:0回答:1

所以我目前正在使用 leaflet 和 javascript 进行地图项目。我和我的团队收集了餐厅数据并将其存储在一个表中,然后我们将其转换为 JSON 文件。该表包含 5 列,分别用于场合、餐厅名称、坐标、预算和素食选项。我们定义了 6 种场合,并对餐厅进行了相应的排序。每个场合都有一个特殊的图标/标记,加上每个场合图标的修改版本,指示餐厅何时是素食主义者。所以总共有 12 种情况,全部由键“Occasion”和“vegan”的组合定义。现在我们正在努力将其转化为代码。理论上,我们希望有一个 if/else 循环遍历不同的条件并充当过滤器,这样我们就可以为每个条件插入特殊标记。但我们找不到如何解决“场合”的价值观。

例如场合是早餐,我们要寻址键值对为“场合”的所有对象:“早餐”,然后添加条件“素食主义者”是“0”(非素食主义者)还是“1”(素食主义者)。

在下一步中,坐标应使用自定义图标显示在地图上。

这是我们的 JSON 数据的示例:

[
{
    "occasion": "breakfast",
    "name": "Café Sehnsucht",
    "coordinates": "50.9500188710593, 6.923410759449042",
    "budget": "€€",
    "vegan": 1
  },
{
    "occasion": "Cafes",
    "name": "Starbucks",
    "coordinates": "50.94287364085991, 6.940380798129923",
    "budget": "€€€",
    "vegan": 1
  },
{
    "occasion": "Save money",
    "name": "Aba Yaprak Döner",
    "coordinates": "50.965968529967455, 7.009311882731048",
    "budget": "€",
    "vegan": 0
  }
]

至此我们已经建立了js脚本和json文件的通信:

//json communication
function readJSON(file) {
  var request = new XMLHttpRequest();
  request.open('GET', file, false);
  request.send(null);
  if (request.status == 200)
    return request.responseText;
};

const temp = readJSON('data.json');
const myObj = JSON.parse(temp);

测试json文件中的数据是否显示在控制台中:

console.log(Object.values(myObj[1]));

然后我们尝试从我们的 json 数据创建一个数组,但不确定我们是否真的必须这样做:

var array = new Array();
var objects = Object.values(myObj[1]);
console.log(objects[0]);

for (i = 0; i < myObj.length; i++) {
  array = objects[i];
}
console.log(array)

现在我们正在研究如何使 if/else 循环工作。由于我不知道如何用正确的语法来表达这一点,所以我只是制作了一个我猜它在理论上应该是什么样子的模型:

    for (i = 0; i < myObj.length; i++) {
    if (value of key "occasion" = "breakfast" && value of key "vegan" = "1") {
    var breakfastIconVegan = L.icon({
      iconUrl: 'icons/breakfasticon_vegan.png',
      iconSize: [20, 20], 
    });
} else if (value of key "occasion" = "breakfast" && value of key "vegan" = "0") {
 var breakfastIcon = L.icon({
      iconUrl: 'icons/breakfasticon.png',
      iconSize: [20, 20], 
    });
}

我们是在正确的道路上还是在胡说八道,我们需要一种完全不同的方法?

javascript json filter leaflet key-value
1个回答
0
投票

无需将数组对象转换为数组的数组。

您可以使用

for (const elem in myObj)

访问对象

let myObj = [
{
    "occasion": "breakfast",
    "name": "Café Sehnsucht",
    "coordinates": "50.9500188710593, 6.923410759449042",
    "budget": "€€",
    "vegan": 1
  },
{
    "occasion": "Cafes",
    "name": "Starbucks",
    "coordinates": "50.94287364085991, 6.940380798129923",
    "budget": "€€€",
    "vegan": 1
  },
{
    "occasion": "Save money",
    "name": "Aba Yaprak Döner",
    "coordinates": "50.965968529967455, 7.009311882731048",
    "budget": "€",
    "vegan": 0
  }
];

let breakfastIconVegan = '';
let breakfastIcon = '';

let Cafes_vegan = '';
let Cafes = '';

for (const elem in myObj) {
    let occasion = myObj[elem].occasion;
    let vegan = myObj[elem].vegan;
    if (occasion == "breakfast" && vegan) {
       breakfastIconVegan = 'icons/breakfasticon_vegan.png'
    } else if (occasion == "breakfast" && !vegan) {
       breakfastIcon = 'icons/breakfasticon.png'
    }
    
    if (occasion == "Cafes" && vegan) {
       Cafes_vegan = 'icons/Cafes_vegan.png'
    } else if (occasion == "Cafes" && !vegan) {
       Cafes = 'icons/Cafes.png'
    }
    
    // ... same logic here with other occasions 
}

console.log(breakfastIconVegan);
console.log(breakfastIcon);

console.log(Cafes_vegan);
console.log(Cafes);

© www.soinside.com 2019 - 2024. All rights reserved.