【问题标题】:Find all values of a particular key in a array of objects or object of objets在对象数组或对象对象中查找特定键的所有值
【发布时间】:2021-09-01 17:11:44
【问题描述】:

我有一个如下的对象数组

let arr = [
  {
    name: "string 1",
    details: [
      {
        id: 1,
        values: [
          { date: "12-Mar", score: "15" },
          { date: "13-Mar", score: "16" },
          { date: "14-Mar", score: "17" },
          { date: "15-Mar", score: "18" },
        ],
      },
    ],
  },
  {
    name: "string 2",
    details: [
      {
        id: 2,
        values: [
          { date: "12-Mar", score: "16" },
          { date: "13-Mar", score: "17" },
          { date: "14-Mar", score: "18" },
          { date: "15-Mar", score: "19" },
        ],
      },
    ],
  },
  {
    name: "string 3",
    details: [
      {
        id: 2,
        values: [
          { date: "12-Mar", score: "21" },
          { date: "13-Mar", score: "22" },
          { date: "14-Mar", score: "23" },
          { date: "15-Mar", score: "24" },
        ],
      },
    ],
  },
];

我也有与下面的对象对象相同的数据

let obj = {
  "string 1": {
    details: [
      {
        id: 1,
        values: [
          { date: "12-Mar", score: "15" },
          { date: "13-Mar", score: "16" },
          { date: "14-Mar", score: "17" },
          { date: "15-Mar", score: "18" },
        ],
      },
    ],
  },
  "string 2": {
    details: [
      {
        id: 2,
        values: [
          { date: "12-Mar", score: "16" },
          { date: "13-Mar", score: "17" },
          { date: "14-Mar", score: "18" },
          { date: "15-Mar", score: "19" },
        ],
      },
    ],
  },
  "string 3": {
    details: [
      {
        id: "2",
        values: [
          { date: "12-Mar", score: "21" },
          { date: "13-Mar", score: "22" },
          { date: "14-Mar", score: "23" },
          { date: "15-Mar", score: "24" },
        ],
      },
    ],
  },
};

我想以数组的形式查找所有日期和所有分数。 对于对象数组,借助此处的答案 (How to find all values of a specific key in an array of nested objects?),我能够使用以下代码获得结果。

因为我不想重复日期,所以我创建了一个Set

dates = new Set(getValue(arr, "date"))

但是,对于对象的对象,我无法得到结果。我该怎么做。

另外,我可以选择将我的数据作为对象的array 或对象的object 获取。由于我必须执行大量操作/分析(我将在 D3 库中使用它来构建图表),哪种格式更好?任何人都可以指导吗?谢谢。

【问题讨论】:

  • 你想得到一个对象数组中所有日期的数组

标签: javascript arrays object


【解决方案1】:

您可以使用递归方法(如参考答案中所示)来选择给定键的所有属性。还可以添加一个unique 参数,如果设置为 true,我们将从属性中创建一个 Set 以确保我们不会返回任何重复项:

        
let arr = [ { name: "string 1", details: [ { id: 1, values: [ { date: "12-Mar", score: "15" }, { date: "13-Mar", score: "16" }, { date: "14-Mar", score: "17" }, { date: "15-Mar", score: "18" }, ], }, ], }, { name: "string 2", details: [ { id: 2, values: [ { date: "12-Mar", score: "16" }, { date: "13-Mar", score: "17" }, { date: "14-Mar", score: "18" }, { date: "15-Mar", score: "19" }, ], }, ], }, { name: "string 3", details: [ { id: 2, values: [ { date: "12-Mar", score: "21" }, { date: "13-Mar", score: "22" }, { date: "14-Mar", score: "23" }, { date: "15-Mar", score: "24" }, ], }, ], }, ];
let obj = { "string 1": { details: [ { id: 1, values: [ { date: "12-Mar", score: "15" }, { date: "13-Mar", score: "16" }, { date: "14-Mar", score: "17" }, { date: "15-Mar", score: "18" }, ], }, ], }, "string 2": { details: [ { id: 2, values: [ { date: "12-Mar", score: "16" }, { date: "13-Mar", score: "17" }, { date: "14-Mar", score: "18" }, { date: "15-Mar", score: "19" }, ], }, ], }, "string 3": { details: [ { id: "2", values: [ { date: "12-Mar", score: "21" }, { date: "13-Mar", score: "22" }, { date: "14-Mar", score: "23" }, { date: "15-Mar", score: "24" }, ], }, ], }, };

function getProperties(obj, key, unique = true, result = []) {
    for(let k in obj) {
        if (typeof(obj[k]) === 'object') {
            getProperties(obj[k], key, unique, result);
        } else if (k === key) { 
            result.push(obj[k]); 
        }
    }
    return unique ? [...new Set(result)]: result;
}
    
console.log('Dates (arr):', JSON.stringify(getProperties(arr, 'date', true)))
console.log('Scores (arr):', JSON.stringify(getProperties(arr, 'score', true)))

console.log('Dates (obj):', JSON.stringify(getProperties(obj, 'date', true)))
console.log('Scores (obj):', JSON.stringify(getProperties(obj, 'score', true)))

【讨论】:

    【解决方案2】:

    您可以像这样遍历对象中的顶级键:

    for (let key in obj){
        let val = obj[key]
    
        /* From here you can proceed with finding all values 
           like you did with the array 
        */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 2020-12-20
      • 2015-09-16
      • 1970-01-01
      • 2019-03-31
      • 2016-07-26
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多