Ниже вы можете увидеть мой код NodeJS, и здесь я хочу напечатать значения объекта, которые уникальны по имени.
Array.prototype.uniqueArray = function (...props) {
if (!props || (props instanceof Array && props.length === 0)) {
return [...this]
} else if (props instanceof Array===true) {
return 'Invalid Parameter Type'
}else{
console.info("test 123")
}
}
console.info([ ].uniqueArray('name') )
console.info([ {id: 1, name: "Jony"}, {id: 2, name: "Jony"}, {id: 3, name: "Kane"}].uniqueArray('name') )
console.info([ {id: 1, name: "Jony"}, {id: 2, name: "Jony"}, {id: 3, name: "Kane"}].uniqueArray('test') )
Я хочу напечатать, если мы вводим пустой массив, который возвращает тот же пустой массив (например, []), И если мы передадим такой параметр, как «имя», он вернет уникальные данные в соответствии с «именем». Так что я могу получить эти результаты правильно.
Но в качестве третьей части «console.info» я хочу вернуть «Недопустимый тип параметра», когда мы передаем недопустимый параметр, который не включается в объект массива, например «тест». Для третьей части console.info, которую я могу получить ниже, результат:
Вывод :
[ { id: 1, name: 'Jony'} ]
Ожидаемый результат:
'Invalid Parameter Type'
Я пытаюсь использовать «props instanceof Array === true», чтобы проверить, являются ли свойства экземпляром массива или нет, но эта часть не работает.
вам нужно использовать Array.isArray(x)
Какой результат вы ожидаете, когда есть объекты, соответствующие этому аргументу? Массив объектов или массив значений name
, например ['Jony', 'Kane']
?
Почему вы ожидаете, что параметр rest будет чем-то другим, кроме массива?
Отвечает ли это на ваш вопрос? Создать массив уникальных объектов по свойствам
@Andy Когда я передаю «имя» в качестве параметра, я хочу получить уникальные данные объекта массива в соответствии с параметром «имя». ([ {id: 1, name: «Джони»}, {id: 3, name: "Кейн"}]). Этот результат в порядке, мой вопрос касается третьего вывода «console.info», я хочу вернуть «Недопустимый тип параметра», когда мы передаем недопустимые параметры.
@MadushNim, что является допустимым параметром в вашем случае? Скажем, если вы хотите, чтобы какой-либо массив был входом, все может быть так просто, как: if (Array.isArray(input)) 'do something' else return 'Invalid Parameter Type'
Одним из подходов может быть дедупликация объектов в новый массив. Вы узнаете, не был ли аргумент найден ни в одном из объектов, если этот массив пуст.
// Double check that uniqueArray doesn't exist
// on the array prototype
if (!('uniqueArray' in Array.prototype)) {
// You're only sending in one argument to the
// function so there's no need to spread it.
Array.prototype.uniqueArray = function(prop) {
// If there is no prop or or there is but it's not
// a string, or the array is empty, return the array
if ((!prop || typeof prop !== 'string') || !this.length) {
return this;
}
// Iterate over the array of objects with reduce,
// initialising it with a Map. This will hold our deduped
// objects.
const deduped = this.reduce((acc, obj) => {
// Using the prop argument find the key which is
// the value of that property in the object.
const key = obj[prop];
// If that key doesn't exist on the Map add it,
// and set its value as the object
if (key && !acc.has(key)) acc.set(key, obj);
// Return the Map for the next iteration
return acc;
}, new Map());
// Grab the values from the Map, and coerce them back
// to an array
const arr = [...deduped.values()];
// If there are no objects in the array it means there were
// no objects with values that matched the argument, so
// return a message
if (!arr.length) return 'Invalid Parameter Type';
// Otherwise return the array
return arr;
}
}
console.info([ ].uniqueArray('name'));
console.info([ ].uniqueArray(23));
console.info([ {id: 1, name: "Jony"}, {id: 2, name: "Jony"}, {id: 3, name: "Kane"}].uniqueArray('name'));
console.info([ {id: 1, name: "Jony"}, {id: 2, name: "Jony"}, {id: 3, name: "Kane"}].uniqueArray('test'));
Итак, где ваша попытка реализовать функциональность? Где ты застрял?