Как проверить пустой массив между массивом объектов и другим массивом объектов в javascript - PullRequest
1 голос
/ 27 марта 2020

У меня есть массив разрешений объектов и groupKey. Я хочу фильтровать между разрешением и groupKey. если массив разрешений - массив объектов (свойство - пустой массив []), то groupkey (Articles, Journals) будет удален. Например, Вот статьи и Журналы - это пустой массив [].

let permission = [{
            Book: [{
                label: "Can View",
                value: "can_view"
            } ]
        },
       {
            Test: [{
                label: "Can View",
                value: "can_view"
            } ]
        }, , {
            Articles: []
        } ,{
            Journals: []
        } 
    ]

const groupKey = [    
 {label: "Book", value: "Book"},
 {label: "Test", value: "test"},
 {label: "Articles", value: "Articlefull"},
 {label: "Journals", value: "Journal"},
]

Мой принятый вывод будет

 let groupKey = [    
     {label: "Book", value: "Book"},
     {label: "Test", value: "test"},
    ]

Я использую метод фильтра, но мне не удалось найти решение.

Ответы [ 4 ]

3 голосов
/ 27 марта 2020

С Object.entries извлеките key и value элемента, проверьте, что массив не пустой, используя value.length>0, затем проверьте, существует ли метка, которая соответствует ключу, если он существует pu sh элемент в array

  const permission = [
    {
      Book: [
        {
          label: "Can View",
          value: "can_view"
        }
      ]
    },
    {
      Test: [
        {
          label: "Can View",
          value: "can_view"
        }
      ]
    },
    ,
    {
      Articles: []
    },
    {
      Journals: []
    }
  ];

  const groupKey = [
    { label: "Book", value: "Book" },
    { label: "Test", value: "test" },
    { label: "Articles", value: "Articlefull" },
    { label: "Journals", value: "Journal" }
  ];
  let NewGrpKey = [];
  permission.map(perm => {
    let key = Object.entries(perm)[0][0];
    let value = Object.entries(perm)[0][1];
    value.length > 0 &&
      NewGrpKey.push(
        groupKey.find(GrpItem => {
          return GrpItem.label === key;
        })
      );
  });
  console.log(NewGrpKey);
2 голосов
/ 27 марта 2020

Мы можем использовать метод reduce для итерации по массиву и проверки, содержит ли объект массив, длина которого больше 0. А затем просто выводим sh элемент в массив результатов. Кроме того, мы можем использовать Map collection для проверки groupKey с O(1).

const keys = new Map(groupKey.map(l => [l.label, l]));
const result = permission.reduce((a, c) => {
    for (let key in c) {
        if (keys.has(key) && c[key].length > 0) {
            a.push(keys.get(key));
        }
    }
    return a;
}, []);

console.log(result);

Пример:

let permission = [{
   Book: [{ label: "Can View", value: "can_view"
   }]
},
{
   Test: [{ label: "Can View", value: "can_view"
   }]
}, , {
   Articles: []
}, {
   Journals: []
}
]

const groupKey = [
   { label: "Book", value: "Book" },
   { label: "Test", value: "test" },
   { label: "Articles", value: "Articlefull" },
   { label: "Journals", value: "Journal" },
]

const keys = new Map(groupKey.map(l => [l.label, l]));
const result = permission.reduce((a, c) => {
    for (let key in c) {
        if (keys.has(key) && c[key].length > 0) {
            a.push(keys.get(key));
        }
    }
    return a;
}, []);

console.log(result);
2 голосов
/ 27 марта 2020

Вы также можете сделать это, используя прототипы массивов filter и some.

Метод filter() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией .

Метод some() проверяет, прошел ли хотя бы один элемент в массиве тест, реализованный предоставленной функцией. Возвращает логическое значение.

let permission = [
	{
	    Book: [
		{
		    label: "Can View",
		    value: "can_view"
		}
	    ]
	},
	{
	    Test: [
		{
		    label: "Can View",
		    value: "can_view"
		}
	    ]
	},
	{
	    Articles: []
	},
	{
	    Journals: []
	}
];

const groupKey = [
    { label: "Book", value: "Book" },
    { label: "Test", value: "test" },
    { label: "Articles", value: "Articlefull" },
    { label: "Journals", value: "Journal" }
];

const res = groupKey.filter(value => (permission.some(ob => typeof ob[value.label] !== 'undefined' && ob[value.label].length > 0)));
console.log(res);
.as-console-wrapper {
  min-height: 100% !important;
 }
1 голос
/ 27 марта 2020

Generi c решение для любого количества входов в массиве разрешений:

(для этого типа groupKey потребуется var, а не const)

var permission = [
  {
    Book: [{
      label: "Can View",
      value: "can_view"
    }]
  },
  {
    Test: [{
      label: "Can View",
      value: "can_view"
    }]
  },
  {
    Articles: []
  }, {
    Journals: []
  } 
]
var groupKey = [    
 {label: "Book", value: "Book"},
 {label: "Test", value: "test"},
 {label: "Articles", value: "Articlefull"},
 {label: "Journals", value: "Journal"},
]

permission.forEach(function(obj) {
  var key = Object.keys(obj)[0];
  if (!obj[key].length) {
   removeFromGroupKey(key);
  }
})


var filteredArray = [];
function removeFromGroupKey(key) {
    filteredArray = groupKey.filter(function(obj) {
        return obj.label != key;
    });

    groupKey = filteredArray.slice();

}

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