Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON操作到可观察的数组集合中_Javascript_Jquery_Arrays_Json_Knockout.js - Fatal编程技术网

Javascript 将JSON操作到可观察的数组集合中

Javascript 将JSON操作到可观察的数组集合中,javascript,jquery,arrays,json,knockout.js,Javascript,Jquery,Arrays,Json,Knockout.js,我正在寻求如何处理此JSON的建议: [{ "title":"Things", "text":"1. Raindrops on roses 2. Whiskers on kittens 3. Bright copper kettles 4. Warm woolen mittens 5. Brown paper packages" },{ "title":"Colors", "text":"1. White 2. Blue 3. Red 4. Yellow 5. Green" },

我正在寻求如何处理此JSON的建议:

[{
  "title":"Things",
  "text":"1. Raindrops on roses 2. Whiskers on kittens 3. Bright copper kettles 4. Warm woolen mittens 5. Brown paper packages"
},{
  "title":"Colors",
  "text":"1. White 2. Blue 3. Red 4. Yellow 5. Green"
},{
  "title":"Animals",
  "text":"1. Dog 2. Rabbit 3. Cat 4. Squirrel 5. Duck"
},{
  "title":"Colors",
  "text":"1. Red 2. Blue 3. Orange 4. Green 5. Purple"
},{
  "title":"Animals",
  "text":"1. Bear 2. Bird 3. Duck 4. Squirrel 5. Rabbit"
},{
  "title":"Colors",
  "text":"1. Yellow 2. White 3. Black 4. Brown 5. Blue"
}]
要返回这些可观察数组集合,请执行以下操作:

  • 标题:颜色,数量:3,项目:
    • 姓名:怀特,分数:9,计数:2
    • 姓名:蓝色,分数:9,计数:3
    • 姓名:红色,分数:8,计数:2
    • 姓名:黄色,分数:7,计数:2
    • 姓名:黑人,分数:3,计数:1
    • 姓名:橙色,分数:3,计数:1
    • 姓名:格林,分数:3,计数:2
    • 姓名:布朗,分数:2,计数:1
    • 姓名:紫色,分数:1,计数:1

  • 标题:动物,数量:2,项目:
    • 姓名:熊,分数:5,计数:1
    • 姓名:狗,分数:5,计数:1
    • 名字:兔子,分数:5,计数:2
    • 名字:鸟,分数:4,计数:1
    • 名字:鸭子,分数:4,计数:2
    • 名字:松鼠,分数:4,计数:2
    • 姓名:猫,分数:3,计数:1

  • 标题:物品,数量:1,物品:
    • 名称:玫瑰上的雨滴,分数:5,计数:1
    • 姓名:小猫胡须,分数:4,计数:1
    • 名称:光亮铜壶,分数:3,计数:1
    • 名称:保暖羊毛手套,分数:2,计数:1
    • 名称:牛皮纸包装,分数:1,计数:1

为了解释,我需要做以下工作:

  • title
    对所有数组进行分组,计算其频率并返回新的列表对象,例如
    title:Colors,count:3
  • 按编号分隔符拆分每个
    文本
    项目以创建项目数组,计算其频率,根据索引位置为其分配分数(即[0]=5到[4]=1),将其分数相加并返回新的项目对象,例如
    名称:白色,分数:9,计数:2
  • 计数对
    列表
    集合进行排序,按
    得分
    计数
    名称对
    项目
    集合进行排序
  • 我创建了以下javascript对象:

    function List(title, items, count) {
        var self = this;
            self.Title = title;
            self.Count = count;
            self.Items = ko.observableArray(items);
    }
    
    function Item(name, count, score) {
        var self = this;
            self.Name = name;
            self.Count = count;
            self.Score = score;
    }
    
    我已经研究了各种方法,我本来打算用underline.js来攻击这个任务,但是我被报告的迭代数组的性能差所推迟

    我预计
    JSON
    文件将比我展示的示例大得多,因此性能将非常重要

    希望有人能提出实现我的目标的最佳方法,或许能展示一个良好的起点

    提前感谢。

    我在本例中使用了,但是您可以很容易地交换它们的库
    每个签名基本相同

    结果

    [
      {
        "Title": "Things",
        "Items": [
          {
            "Name": "Raindrops on roses",
            "Score": 0,
            "Count": 1
          },
          {
            "Name": "Whiskers on kittens",
            "Score": 1,
            "Count": 1
          },
          {
            "Name": "Bright copper kettles",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Warm woolen mittens",
            "Score": 3,
            "Count": 1
          },
          {
            "Name": "Brown paper packages",
            "Score": 4,
            "Count": 1
          }
        ],
        "Count": 5
      },
      {
        "Title": "Colors",
        "Items": [
          {
            "Name": "White",
            "Score": 1,
            "Count": 2
          },
          {
            "Name": "Blue",
            "Score": 6,
            "Count": 3
          },
          {
            "Name": "Red",
            "Score": 2,
            "Count": 2
          },
          {
            "Name": "Yellow",
            "Score": 3,
            "Count": 2
          },
          {
            "Name": "Green",
            "Score": 7,
            "Count": 2
          },
          {
            "Name": "Orange",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Purple",
            "Score": 4,
            "Count": 1
          },
          {
            "Name": "Black",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Brown",
            "Score": 3,
            "Count": 1
          }
        ],
        "Count": 9
      },
      {
        "Title": "Animals",
        "Items": [
          {
            "Name": "Dog",
            "Score": 0,
            "Count": 1
          },
          {
            "Name": "Rabbit",
            "Score": 5,
            "Count": 2
          },
          {
            "Name": "Cat",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Squirrel",
            "Score": 6,
            "Count": 2
          },
          {
            "Name": "Duck",
            "Score": 6,
            "Count": 2
          },
          {
            "Name": "Bear",
            "Score": 0,
            "Count": 1
          },
          {
            "Name": "Bird",
            "Score": 1,
            "Count": 1
          }
        ],
        "Count": 7
      }
    ]
    

    哇-很好的回答。非常感谢。我正在处理这件事,稍后会再回复。你有机会处理吗?我没有添加
    ko。observableArray
    组件,因为我认为您对转换例程更感兴趣,但它们应该非常容易添加。如果你有任何问题,请告诉我。嗨,布兰登,很抱歉回复晚了。我确实尝试将您的解决方案重新创建为纯淘汰(models、ko.observearrays和ko.utils),因为我需要合并更多功能,我怀疑淘汰MVVM会很好地适应这些功能。e、 在回答你的问题之前,我希望这个问题有一个明确的答案。正如我所说,性能是至关重要的,所以如果lo dash的_each比knockout的ArrayForEach快(例如),我会同意这一点。
    [
      {
        "Title": "Things",
        "Items": [
          {
            "Name": "Raindrops on roses",
            "Score": 0,
            "Count": 1
          },
          {
            "Name": "Whiskers on kittens",
            "Score": 1,
            "Count": 1
          },
          {
            "Name": "Bright copper kettles",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Warm woolen mittens",
            "Score": 3,
            "Count": 1
          },
          {
            "Name": "Brown paper packages",
            "Score": 4,
            "Count": 1
          }
        ],
        "Count": 5
      },
      {
        "Title": "Colors",
        "Items": [
          {
            "Name": "White",
            "Score": 1,
            "Count": 2
          },
          {
            "Name": "Blue",
            "Score": 6,
            "Count": 3
          },
          {
            "Name": "Red",
            "Score": 2,
            "Count": 2
          },
          {
            "Name": "Yellow",
            "Score": 3,
            "Count": 2
          },
          {
            "Name": "Green",
            "Score": 7,
            "Count": 2
          },
          {
            "Name": "Orange",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Purple",
            "Score": 4,
            "Count": 1
          },
          {
            "Name": "Black",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Brown",
            "Score": 3,
            "Count": 1
          }
        ],
        "Count": 9
      },
      {
        "Title": "Animals",
        "Items": [
          {
            "Name": "Dog",
            "Score": 0,
            "Count": 1
          },
          {
            "Name": "Rabbit",
            "Score": 5,
            "Count": 2
          },
          {
            "Name": "Cat",
            "Score": 2,
            "Count": 1
          },
          {
            "Name": "Squirrel",
            "Score": 6,
            "Count": 2
          },
          {
            "Name": "Duck",
            "Score": 6,
            "Count": 2
          },
          {
            "Name": "Bear",
            "Score": 0,
            "Count": 1
          },
          {
            "Name": "Bird",
            "Score": 1,
            "Count": 1
          }
        ],
        "Count": 7
      }
    ]