首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超前嵌套json对象

超前嵌套json对象
EN

Stack Overflow用户
提问于 2015-01-15 20:22:00
回答 1查看 397关注 0票数 1

我对Ember和JSON很陌生。我希望解析一个JSON对象,该对象在下面带有,并通过搜索嵌套的对象值来访问它们的键。

我有一个Json格式:

代码语言:javascript
复制
return [
  {
    "id": 1,
    "category_name": "Supermarket",
    "category_description": "SUPER MARKET",
    "image_url": "",
    "merchants": [
    {
      "name": "CARREFOUR",
      "id": 12,
      "merchant_type_id": 1,
      "merchant_type_description": "Gold",
      "merchant_redeption_rate": 0.002500,
      "image_url": "https://jpg",
      "branches": [
      {
        "id": 123456,
        "latitude": 37.939483,
        "area": "ΑΓ. ΔΗΜΗΤΡΙΟΣ",
        "zip": "12345"
      },
      {
        "id": 4567890,
        "longitude": 23.650622,
        "area": "ΑΓ. ΙΩΑΝΝΗΣ ΡΕΝΤΗΣ",
        "zip": "12345"
      }
      ]
    },
    {
      "name": "CAFCO",
      "id": 13,
      "merchant_type_id": 3,
      "merchant_type_description": "None",
      "merchant_redeption_rate": 0.002500,
      "image_url": "https:.jpg",
      "branches": [
      {
        "id": 127890,
        "latitude": 38.027870,
        "area": "ΠΕΡΙΣΤΕΡΙ",
        "zip": "12345"
      }
      ]
    }
    ]
  },


{
  "id": 2,
  "category_name": "Πολυκαταστήματα",
  "category_description": "ΠΟΛΥΚΑΤΑΣΤΗΜΑ",
  "image_url": "",
  "merchants": [
  {
    "name": "AGGELOPOYLOS CHR.",
    "id": 15,
    "merchant_type_id": 2,
    "merchant_type_description": "Silver",
    "merchant_redeption_rate": 0.002500,
    "image_url": "https://www.nbg.gr/greek/retail/cards/reward-programmes/gonational/PublishingImages/aggelopoulos.jpg",
    "branches": [
    {
      "id": 234780,
      "latitude": 35.366118,
      "longitude": 24.479461,
      "address": "ΕΘΝ. ΜΑΚΑΡΙΟΥ 9 & ΕΛ. ΒΕΝΙΖΕΛΟΥ 1",
      "area": "Ν. ΦΑΛΗΡΟ",
      "zip": "12345"
    }
    ]
  }
  ]
}


];

--------------------------Updated

例如,我想使用“提前输入”搜索商户的名称,当我们为搜索所写的信件与商户的名称匹配时,它将出现相应的category_name和反向。

示例->当我输入s时,它将出现:类别:超市,名称:家乐福名称: CAFCO

而同样的输出在下拉式搜索时,我键盘的字母是c。

有什么帮助吗?

新的Jsbin示例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-16 03:25:33

在我看来,最简单的方法就是创建一个包含纬度数组的计算属性。但我们怎样才能到达那里?

要达到latitude,您需要遍历merchants数组和branches数组。由于这将跨越多个元素,您将以“数组数组”类型的数据结构结束,这是很烦人的。因此,为了简化这一点,我们可以创建一个简单的flatten函数,如下所示:

代码语言:javascript
复制
  flatten: function(origArray){
    var newArr = [];
    origArray.forEach(function(el) {
      el.forEach(function(eachEl){
        newArr.push(eachEl);
      });
    });

    return newArr;
  },

除了上面的函数之外,Ember还为我们提供了许多其他有用的函数,可以在数组上使用(参见这里)。其中一个是mapBy(property),它将数组转换为另一个数组,只保留我们指定的属性值。

因此,要创建一个lats (用于纬度)属性,我们可以这样做:

代码语言:javascript
复制
lats: function(){
  var merchantsArr = this.get('model').mapBy('merchants');
  merchantsArr = this.flatten(merchantsArr);
  var branchesArr = merchantsArr.mapBy('branches');
  branchesArr = this.flatten(branchesArr);

  return branchesArr.mapBy("latitude").compact();
}.property('model')

上面,我基本上使用的是mapByflatten (见上面)和compact

返回删除了所有空元素和未定义元素的数组的副本。

一旦您拥有了包含所有必要数据的lats属性,其余的就很容易了。

对组件的调用变成:

代码语言:javascript
复制
{{x-typeahead data=lats name='category_name' selection=myColor}}

注意lats,而不是最初传递到组件中的model

现在,要访问组件中的data属性值,请执行以下操作

代码语言:javascript
复制
`this.get('data')`

您可以将其作为source传入,如下所示:

代码语言:javascript
复制
source: substringMatcher(self.get('data'))

工作溶液这里

更新

根据你最新的问题更新我的答案。

好吧,这有点复杂了。您现在需要的不仅仅是来自对象的一个属性(latitude)。你需要category_name和商人name

除了只从数组中获取一个属性的mapBy之外,Ember还有一个map,它允许您将数组转换为您想要的几乎任何东西:

代码语言:javascript
复制
lats: function(){
  var merchantsArr = this.get('model').map(function(thing){
    var category_name = thing.category_name;
    return thing.merchants.map(function(merchant){
      return {
        "name": merchant.name,
        "category": category_name
      };
    });
  });

  merchantsArr = this.flatten(merchantsArr);

  return merchantsArr;
}.property('model')

上面的代码看起来很复杂,但它基本上只是返回一个顶级对象的商人数组,并伴随着category_name。因为这是一个数组,所以我们需要将其扁平化。

然后,在组件内部,我们需要记住,我们不仅仅是传递一个字符串数组,而是传递一个对象数组。因此,我们需要查看对象的属性(名称和类别)是否匹配。

代码语言:javascript
复制
$.each(strs, function(i, str) {
  if (substrRegex.test(str.name) || substrRegex.test(str.category)) {
    matches.push(str);
  }
});

最后,要实际同时显示类别和商家名称,您需要告诉“提前输入”如何做到这一点:

代码语言:javascript
复制
templates: {
  suggestion: Handlebars.compile('<p>{{name}} – {{category}}</p>')
}

工作溶液这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27972316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档