【问题标题】:Selecting and sorting data JSON选择和排序数据 JSON
【发布时间】:2021-08-05 21:24:21
【问题描述】:

我需要开发一个简单的应用程序来从 JSON 列表中选择和排序数据,包含两个规则 - “include”和“sort_by”

示例: 输入数据:

{"data": [{"name": "John", "email": "john2@mail.com"},
          {"name": "John", "email": "john1@mail.com"},
          {"name": "Jane", "email": "jane@mail.com"}]}

条件:

{"condition": {"include": [{"name": "John"}], "sort_by": ["email"]}}

输出:

{"result": [{"name": "John", "email": "john1@mail.com"},
            {"name": "John", "email": "john2@mail.com"}]}

【问题讨论】:

  • 请分享您目前尝试过的代码。
  • 欢迎来到 SO。请查看和How to Ask,获取tour(您会获得徽章),并提供您尝试过的内容或遇到问题的地方。如果可能的话,包括你的尝试的minimal reproducible example
  • @Yash Maheshwari 甚至不知道如何开始。您可以从头开始提供解决方案

标签: javascript arrays json sorting filter


【解决方案1】:

您可以使用for..in 循环轻松实现此结果,以获取您需要的属性filter,然后sort(使用自定义排序)相应地得到它。

const obj = {
  data: [
    { name: "John", email: "john2@mail.com" },
    { name: "John", email: "john1@mail.com" },
    { name: "Jane", email: "jane@mail.com" },
  ],
};

const test = {
  condition: {
    include: [{ name: "John" }],
    sort_by: ["email"],
  },
};

let prop;
for (let key in test.condition.include[0]) {
  prop = key;
}

const include_prop = test.condition.include[0][prop];
const sort_by_prop = test.condition.sort_by[0];

const result = obj.data
  .filter((o) => o[prop] === include_prop)
  .sort((a, b) => (b[sort_by_prop] > a[sort_by_prop] ? -1 : 1));

const resultObj = { result };
console.log(resultObj);

【讨论】:

    【解决方案2】:

    这里有两件事要做,排序和过滤...

    const data = [
      {"name": "John", "email": "john2@mail.com"},
      {"name": "John", "email": "john1@mail.com"},
      {"name": "Jane", "email": "jane@mail.com"}
    ]
    const sortAndInclude = (data, include, sortBy) => {
      //filter by name
      const newData = data.filter(x => x[include[0]] == include[1])
      
      // sort by sortBy
      newData.sort(function(a, b) {
        var aa = a[sortBy].toUpperCase(); // ignore upper and lowercase
        var bb = b[sortBy].toUpperCase(); // ignore upper and lowercase
      if (aa < bb) {
        return -1;
      }
      if (aa > bb) {
        return 1;
      }
    
      // names must be equal
      return 0;
    });
      
      return newData
      
    }
    
    console.log(sortAndInclude(data, ["name", "John"], ['email']))
    

    编辑:过滤器说明...

    filter 方法返回一个新数组,我们称之为newData。 filter 方法遍历数组并删除条件为假的任何元素。在这种情况下,我们调用元素x。我们希望函数是可重用的,所以我们使用x[include[0]]include[1]。我们的include 变量是更宽函数的第二个参数,所以当我们调用sortAndInclude(data, ["name", "John"], ['email']) 时,include 是一个包含两个元素["name", "John"] 的数组。因此,在过滤方法的条件下,当我们说x[include[0]] == include[1] 时,我们实际上是在说x["name"] == x["John"]。因此过滤器方法将删除元素名称键不具有“John”值的任何元素。

    Here's some more info on filters.

    【讨论】:

    • 非常感谢,这真的很有帮助!但我实际上并没有得到这个条件:“const newData = data.filter(x => x[include[0]] == include[1])”。 (x["name"] ==["John"])?能否详细解释一下?
    • 没问题,我已经在回答中添加了函数说明。
    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2013-08-30
    • 2021-07-08
    • 2021-06-19
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多