Подсчет атрибутов в модели, где подсчитываемый объект часто изменяется - PullRequest
0 голосов
/ 07 сентября 2018

Для данного сценария мне нужно посчитать сумму items в данном поле. Ниже должно отражать лучше.

resource = {
     name1 : [1,2,3,4],
     name2 : [a,b,c]
}

но иногда это будет выглядеть

resource = [1, 2, c, 8]

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

для этого примера первый сценарий будет 7 items, а второй вернет 4 items

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Решение, предоставленное @ OriDrori , работает для данного примера. Если вы добавляете слой глубины, он перестает работать.

const resource1 = {
     name1 : [1,2,3,4],
     name2 : ['a','b','c']
}

const resource2 = [1, 2, 'c', 8];

const resource3 = {
     subResource: {
       name1 : [1,2,3,4]
     },
     name2 : ['a','b','c']
};

const countItems = (obj) => [].concat(...Object.values(obj)).length;

console.log(countItems(resource1)); // 7

console.log(countItems(resource2)); // 4

console.log(countItems(resource3)); // 4 Instead of 7

Вместо этого вы должны создать рекурсивную функцию (функцию, которая вызывает себя) для обработки любого уровня глубины.

const resource1 = {
     name1 : [1,2,3,4],
     name2 : ['a','b','c']
}

const resource2 = [1, 2, 'c', 8];

const resource3 = {
     subResource: {
       name1 : [1,2,3,4]
     },
     name2 : ['a','b','c']
};

const resource4 = {
     subResource: {
       subsubResource: {
         name1 : [1,2,3,4]
       }
     },
     name1 : [1,2,3,4],
     name2 : ['a','b','c']
};

const countItems = (obj) => {
  let total = 0;
  if (Array.isArray(obj)) { total += obj.length; }
  else {
   for (const key in obj) {
     total += countItems(obj[key]);
   }
  }
  
  return total;
};

console.log(countItems(resource1)); // 7
console.log(countItems(resource2)); // 4
console.log(countItems(resource3)); // 7
console.log(countItems(resource4)); // 11
0 голосов
/ 07 сентября 2018

Вы можете использовать Object.values() и Array.concat() для преобразования свойств объекта resource в один массив. Это не повлияет на массив resource. Тогда получите длину.

const resource1 = {
     name1 : [1,2,3,4],
     name2 : ['a','b','c']
}

const resource2 = [1, 2, 'c', 8];

const countItems = (obj) => [].concat(...Object.values(obj)).length;

console.log(countItems(resource1)); // 7

console.log(countItems(resource2)); // 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...