Поиск повторяющихся значений на разных уровнях многомерного объекта JSON в JavaScript - PullRequest
1 голос
/ 03 мая 2019

У меня есть объект 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;
});

Но потом я понял, что эта функция быланевозможно получить доступ к различным уровням объекта и сравнить эти значения.Более того, я не мог сосредоточиться на этом.

Я ценю любые конструктивные ответы в виде кода или рекомендации.

Ответы [ 3 ]

2 голосов
/ 03 мая 2019

Вы можете создать функцию, которая принимает свойство, т.е. startOn и значение.Используйте forEach для массива, если prop соответствует заданному значению, затем отправьте его индекс в результирующий объект.

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'))
1 голос
/ 03 мая 2019

Предполагая, что у вас есть объект с массивами, вы можете получить значения, итерировать массивы и получить количество искомого ключа.

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);
1 голос
/ 03 мая 2019

Вы можете использовать массив 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)
...