【问题标题】:Removing duplicate values from nested JSON从嵌套 JSON 中删除重复值
【发布时间】:2019-06-21 22:20:17
【问题描述】:

我目前正在从本地 JSON 文件呈现Labels 的列表(请参阅 JSON sn-p)。但是,有duplicates of them,我想让每个人都出现一次。我尝试实现Array.filter() 和其他一些方法来获得这一行:"Categories": obj.ResourceType.results.map(function(val) { return val.Label;,但我的语法有些问题,所以没有渲染。

有什么想法吗?理想情况下,我想用一些东西来替换这部分代码:

distinctArray(inp) {
  let uniqueArr = [];

  for(var i = 0; i < inp.length; i++) {
    if(inp[i] == undefined) continue;
    if(uniqueArr.indexOf(inp[i]) < 0) {
      uniqueArr.push(inp[i]);
    }
  }
return uniqueArr;
}

,同时仍在处理它上面的这个部分:

let categories = this.distinctArray(temp).sort();

$("#km-labels").html(categories.join("<br>"));

JS sn-p:

import $ from 'jquery';

import JSONfile from '../../../public/JSONfile.json';
import { basename } from 'path';

var categories = '';

export default class {
    constructor() {
        this.loadData();
    }

// ------------------------------------ //

    loadData() {          
        let res = JSONfile.d.results.filter(function(val) {
          return (val.FileLeafRef.trim().length > 0);
        }).map(function(obj) {

            return {
              "FileName": obj.FileLeafRef,
              "Path": obj.EncodedAbsUrl,
              "Categories": obj.ResourceType.results.map(function(val) {
                 return val.Label;
              }).join(";")
            };
        });

    // debugger;

      let temp = JSONfile.d.results.filter(function(val) {
        return (val.FileLeafRef.trim().length > 0);
      }).map(function(obj) {

        return obj.ResourceType.results.map(function(val) {
            return val.Label;
          })
        });


      let categories = this.distinctArray(temp).sort();

      $("#km-labels").html(categories.join("<br>"));

      console.log(categories);


  } // ------------- loadData

// ------------------------------------ //

  distinctArray(inp){
    let uniqueArr = [];

    for(var i = 0; i < inp.length; i++) {
      if(inp[i] == undefined) continue;
      if(uniqueArr.indexOf(inp[i]) < 0) {
        uniqueArr.push(inp[i]);
      }
    }
    return uniqueArr;
  }

JSON sn-p

{
  "d": {
    "results": [
      {
        "__metadata": {
          "id": "[redacted]",
          "uri": "[redacted]",
          ...
          "type": "[redacted]"
        },
        "File": {
          "__metadata": {
            "id": "[redacted]",
            "uri": "[redacted]",
            "type": "SP.File"
          },
          "Name": "[redacted]"
        },
        "FileLeafRef": "[redacted]",
        "ResourceType": {
          "__metadata": {
            "type": "Collection([redacted])"
          },
          "results": [
            {
              "Label": "Guides \uff06 Protocols",
              ...
              ...
            }
          ]
        },
        "EncodedAbsUrl": "[redacted]"
      },
      {
        "__metadata": {
          "id": "[redacted]",
          "uri": "[redacted]",
          ...
          "type": "[redacted]"
        },
        "File": {
          "__metadata": {
            "id": "[redacted]",
            "uri": "[redacted]",
            "type": "[redacted]"
          },
          "Name": "[redacted]"
        },
        "FileLeafRef": "[redacted]",
        "ResourceType": {
          "__metadata": {
            "type": "[redacted]"
          },
          "results": [
            {
              "Label": "Templates",
              "TermGuid": "[redacted]",
              ...
            },
            {
              "Label": "Guides \uff06 Protocols",
              "TermGuid": "[redacted]",
              ...
            }
          ]
        },
        "EncodedAbsUrl": "[redacted]"
      },
...
...

更新:

       let unique = {};
          let temp = JSONfile.d.results.filter(function(val) {
            return (val.FileLeafRef.trim().length > 0);            
          }).forEach(function(obj) {
            obj.ResourceType.results.forEach(function(val) {
              unique[val.Label] = val;
            })
          }).map(function(obj) {

            return obj.ResourceType.results.map(function(val) {
                return val.Label;
              })
            });

【问题讨论】:

  • temp 是一个二维数组。 distinctArray() 需要一个平面数组。

标签: javascript jquery arrays json duplicates


【解决方案1】:

使用以标签为键的对象。由于对象键是唯一的,因此该对象的值不会有任何重复的标签。

let unique = {};
JSONfile.d.results.filter(function(val) {
  return (val.FileLeafRef.trim().length > 0);
}).forEach(function(obj) {
   obj.ResourceType.results.forEach(function(val) {
     unique[val.Label] = true; // value can be anything, only keys matter
  })
});

let categories = Object.keys(unique).sort();

【讨论】:

  • 我可以将它添加到第二个JSONfile.d.results 部分下方(请参阅更新后的内容)。如果是这样,我被告知“地图”的属性是未定义的。
  • 我已经更新了答案。这将替换所有 .map() 的东西。
  • 它起作用了---我将您的代码 sn-p 移到另一个块中(与我提供的更新分开)。非常感谢!
  • 这是另一种方法,它使用的新功能更少。
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 2021-02-23
  • 2016-10-19
  • 2019-11-17
  • 2019-07-31
  • 2021-11-27
  • 1970-01-01
  • 2018-04-14
相关资源
最近更新 更多