javascript - JSON - 基于唯一 ID 的值搜索数组

标签 javascript arrays json search lookup

我有以下 JSON 提要:

var data = {
    "feeds": {
        "regions": [
            {
                "name": "Lichtenberg",
                "id": "01408.b",
                "suburbs": [
                    { "name": "Fennpfuhl", "views": 76400 },
                    { "name": "Lichtenberg", "views": 87895 },
                    { "name": "Rummelsberg", "views": 10239 }
                ]
            },
            {
                "name": "Mitte",
                "id": "03442.f",
                "suburbs": [
                    { "name": "Tiergarten", "views": 82695 },
                    { "name": "Mitte", "views": 67234 },
                    { "name": "Hansaviertel", "views": 10848 },
                    { "name": "Moabit", "views": 67500 }
                ]
            },
            {
                "name": "Friedrichshain-Kreuzberg",
                "id": "01991.o",
                "suburbs": [
                    { "name": "Friedrichshain", "views": "98494" },
                    { "name": "Kreuzberg", "views": "27800" }
                ]
            },
            {
                "name": "Templehof-Schöneberg",
                "id": "01778.k",  
                "suburbs": [
                    { "name": "Friedenau", "views": 76595 },
                    { "name": "Schöneberg", "views": 20731 },
                    { "name": "Templehof", "views": 58000 },
                    { "name": "Mariendorf", "views": 32300 }
                ]
            },
            {
                "name": "Pankow",
                "id": "02761.q",
                "suburbs": [
                    { "name": "Wießensee", "views": 81294 },
                    { "name": "Prenzlauer Berg", "views": 76470 },
                    { "name": "Pankow", "views": 90210 }
                ]
            }
        ],
    "branding": [
      {
        "municipality_id": "01408.b",
        "brand_color": "#f9cd90"
      },{
        "municipality_id": "03442.f",
        "brand_color": "#F28123"
      },{
        "municipality_id": "01991.o",
        "brand_color": "#D34E24"
      },{
        "municipality_id": "01778.k",
        "brand_color": "#563F1B"
      },{
        "municipality_id": "02761.q",
        "brand_color": "#38726C"
      }
    ],
        "customer": {
            "name": "Viktoria Tiedemann",
            "date_of_birth": "1981-09-19",
            "address": {
                "street": "Schönfließer Str 9",
                "suburb": "Prenzlauer Berg",
                "postcode": "10439"
            }
        }
    }
};

本质上我想做的是创建一个包含 3 个项目的数组:

  1. 区域名称data.feeds.regions.name
  2. 该地区的总浏览量
  3. 基于 data.feeds.regions.id 的图表颜色,然后用作 data.branding 的查找键以获取 brand_color 该地区的。

我从之前的 SO 问题中得到了第 1 部分和第 2 部分的答案:

var viewsPerRegion = data.feeds.regions.map(({ name, suburbs }) => ({
  label: name,
  total: suburbs.reduce((a, { views }) => a + Number(views), 0)
})); 

到目前为止,我尝试获得第三个的尝试如下:

var viewsPerRegionStyled = data.feeds.regions.map(({ name, id, suburbs }) => ({
  label: name,
  total: suburbs.reduce((a, { views }) => a + Number(views), 0),
  color: if (data.feeds.region.id == data.branding.municipality_id) 
{
data.branding.brand_color} 
})); 

我确定我完全迷失了这一点 - 非常感谢任何帮助。

最佳答案

您需要在 branding 数组上调用 find 以找到具有匹配 municipality_id 的元素,然后提取找到的 brand_color 属性:

var data={"feeds":{"regions":[{"name":"Lichtenberg","id":"01408.b","suburbs":[{"name":"Fennpfuhl","views":76400},{"name":"Lichtenberg","views":87895},{"name":"Rummelsberg","views":10239}]},{"name":"Mitte","id":"03442.f","suburbs":[{"name":"Tiergarten","views":82695},{"name":"Mitte","views":67234},{"name":"Hansaviertel","views":10848},{"name":"Moabit","views":67500}]},{"name":"Friedrichshain-Kreuzberg","id":"01991.o","suburbs":[{"name":"Friedrichshain","views":"98494"},{"name":"Kreuzberg","views":"27800"}]},{"name":"Templehof-Schöneberg","id":"01778.k","suburbs":[{"name":"Friedenau","views":76595},{"name":"Schöneberg","views":20731},{"name":"Templehof","views":58000},{"name":"Mariendorf","views":32300}]},{"name":"Pankow","id":"02761.q","suburbs":[{"name":"Wießensee","views":81294},{"name":"Prenzlauer Berg","views":76470},{"name":"Pankow","views":90210}]}],"branding":[{"municipality_id":"01408.b","brand_color":"#f9cd90"},{"municipality_id":"03442.f","brand_color":"#F28123"},{"municipality_id":"01991.o","brand_color":"#D34E24"},{"municipality_id":"01778.k","brand_color":"#563F1B"},{"municipality_id":"02761.q","brand_color":"#38726C"}],"customer":{"name":"Viktoria Tiedemann","date_of_birth":"1981-09-19","address":{"street":"Schönfließer Str 9","suburb":"Prenzlauer Berg","postcode":"10439"}}}}

var viewsPerRegionStyled = data.feeds.regions.map(({ name, id, suburbs }) => ({
  label: name,
  total: suburbs.reduce((a, { views }) => a + Number(views), 0),
  color: data.feeds.branding.find(
    ({ municipality_id }) => municipality_id === id
  ).brand_color
}));
console.log(viewsPerRegionStyled);

另一种选择是将 branding 数组预先转换为由 municipality_id 索引的对象,这将允许简单的对象查找,其复杂性低于 。查找:

var data={"feeds":{"regions":[{"name":"Lichtenberg","id":"01408.b","suburbs":[{"name":"Fennpfuhl","views":76400},{"name":"Lichtenberg","views":87895},{"name":"Rummelsberg","views":10239}]},{"name":"Mitte","id":"03442.f","suburbs":[{"name":"Tiergarten","views":82695},{"name":"Mitte","views":67234},{"name":"Hansaviertel","views":10848},{"name":"Moabit","views":67500}]},{"name":"Friedrichshain-Kreuzberg","id":"01991.o","suburbs":[{"name":"Friedrichshain","views":"98494"},{"name":"Kreuzberg","views":"27800"}]},{"name":"Templehof-Schöneberg","id":"01778.k","suburbs":[{"name":"Friedenau","views":76595},{"name":"Schöneberg","views":20731},{"name":"Templehof","views":58000},{"name":"Mariendorf","views":32300}]},{"name":"Pankow","id":"02761.q","suburbs":[{"name":"Wießensee","views":81294},{"name":"Prenzlauer Berg","views":76470},{"name":"Pankow","views":90210}]}],"branding":[{"municipality_id":"01408.b","brand_color":"#f9cd90"},{"municipality_id":"03442.f","brand_color":"#F28123"},{"municipality_id":"01991.o","brand_color":"#D34E24"},{"municipality_id":"01778.k","brand_color":"#563F1B"},{"municipality_id":"02761.q","brand_color":"#38726C"}],"customer":{"name":"Viktoria Tiedemann","date_of_birth":"1981-09-19","address":{"street":"Schönfließer Str 9","suburb":"Prenzlauer Berg","postcode":"10439"}}}}

var colorsById = data.feeds.branding.reduce((a, { municipality_id, brand_color }) => {
  a[municipality_id] = brand_color;
  return a;
}, {});
var viewsPerRegionStyled = data.feeds.regions.map(({ name, id, suburbs }) => ({
  label: name,
  total: suburbs.reduce((a, { views }) => a + Number(views), 0),
  color: colorsById[id]
}));
console.log(viewsPerRegionStyled);

关于javascript - JSON - 基于唯一 ID 的值搜索数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52109062/

相关文章:

javascript - 显示外部网站 iframe 的内容并防止 Framekilling

javascript - 如何在现代浏览器中使用 mousein 事件?

c++ - 指针或堆对象的二维数组

c++ - 关于 C++ 中的指针和数组

javascript - 简单的 TCP 聊天 node.js

Javascript将不同的字符串格式化成标准的区间格式

javascript - mousedown 事件可以在循环中间发生吗?

c - 如何将 typedef 结构数组的变量复制并传输到另一个 - C

jquery - 使用 jQuery 的 Twitter feed

javascript - 当所有下拉列表相互链接时,如何过滤下拉列表中的值?