【问题标题】:Finding duplicate values on different levels of a multidimensional JSON object in JavaScript在 JavaScript 中查找多维 JSON 对象的不同级别的重复值
【发布时间】:2019-09-21 16:58:17
【问题描述】:

我有一个 JSON 对象(字符串化)getResponse["taskData"],例如:

[
   {title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"},
   {title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"},
   {title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"},
   {title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"},
   {title: "zxcvbn", startOn: "2-5-2019-9-0", endOn: "2-5-2019-11-0"}
]

我需要知道在多维对象的不同级别上有多少个 startOn 值重复。

例如,得到30-4-2019-18-0 (2), 1-5-2019-16-30 (2) 对我很有用。或者,获取相应重复项的索引整数也会有所帮助。

我一直在尝试使用这个来实现这样的功能:

var countSameStart = {};
getResponse["taskData"].forEach(function (x) {
    countSameStart[x] = ( countSameStart[x] || 0 ) + 1;
});

但是,后来我发现这个函数无法访问对象的不同级别并比较这些值。而且,我也想不通。

我感谢任何建设性的答案作为代码或建议。

【问题讨论】:

  • “对象的不同层次”是什么意思
  • 您展示的是一个对象数组,其值都是字符串。如果你在 forEach 中写 console.log(x) ,你可以看到你正在处理什么。
  • @NinaScholz 我试图解释比较 getResponse["taskData"][i][1] 并构造一个包含所述结果的数组。
  • 如果您将字符串化 (JSON) 对象(而不是控制台副本)添加到问题中,它会更容易。它没有所有的行或属性,但我们需要了解您所说的对象。

标签: javascript arrays json multidimensional-array duplicates


【解决方案1】:

您可以创建一个带有属性的函数,即startOn 和值。如果 prop 与给定值匹配,则在数组上使用 forEach,然后将其索引推送到结果对象。

const arr = [{title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"}, {title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"}, {title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"}, {title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"}, {title: "zxcvbn", startOn: "2-5-2019-9-0", endOn: "2-5-2019-11-0"}]
   
function dups(arr,key,val){
  let res = [];
  arr.forEach((x,i) => {
    if(x[key] === val) res.push(i);
  })
  return res;
}

console.log(dups(arr,'startOn','30-4-2019-18-0'))

【讨论】:

    【解决方案2】:

    假设您有一个带有数组的对象,那么您可以获取值并迭代数组并获取所需键的计数。

    var getResponse = { taskData: [{ title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0" }, { title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0" }, { title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }, { title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }, { title: "zxcvbn", startOn: "2-5-2019-9-0", endOn: "2-5-2019-11-0" }], otherData: [{ title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0" }, { title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }, { title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }] },
        key = 'startOn',
        count = Object.values(getResponse).reduce(
            (c, a) => (a.forEach(({ [key]: item }) => c[item] = (c[item] || 0) + 1), c),
            Object.create(null)
        );
    
    console.log(count);

    【讨论】:

    • 请原谅我缺乏知识,但是我想知道如果我使用这个sn-p,会减少函数更改对象,还是只是将更改后的版本分配给变量?
    • reduce 函数(仅)更改累加器 c,它以一个真正的空对象(无原型)开始,并作为结果返回。
    • 好的,我需要相应的密钥,这就是为什么我将其更改为接受的答案。我也可以将它与对象的其他层一起使用,感谢您也将其作为示例。
    【解决方案3】:

    您可以使用数组 reduce 并创建一个对象,其中键将是 startOn,其值将是一个对象数组。然后您可以获取该键值并使用长度来获取具有相同startOn的项目数

    let data = [{
        title: "123456",
        startOn: "30-4-2019-18-0",
        endOn: "30-4-2019-19-0"
      },
      {
        title: "123456",
        startOn: "30-4-2019-18-0",
        endOn: "30-4-2019-19-0"
      },
      {
        title: "qwerty",
        startOn: "1-5-2019-16-30",
        endOn: "1-5-2019-19-0"
      },
      {
        title: "asdfgh",
        startOn: "1-5-2019-16-30",
        endOn: "1-5-2019-19-0"
      },
      {
        title: "zxcvbn",
        startOn: "2-5-2019-9-0",
        endOn: "2-5-2019-11-0"
      }
    ]
    
    let k = data.reduce(function(acc, curr) {
      if (acc[curr.startOn]) {
        acc[curr.startOn].push(curr)
      } else {
        acc[curr.startOn] = [curr]
      }
      return acc;
    
    }, {});
    console.log(k["30-4-2019-18-0"].length)

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2017-03-06
      • 1970-01-01
      相关资源
      最近更新 更多