我正在尝试为我的训练营解决一个名为isSubsetOf的玩具问题,该问题需要一个字符串,数字,数组和/或包含对象的数组组成的数组。 然后将其用作现有数组上的方法,并返回一个布尔值,提示“此”数组是否是输入数组(包含在其中)的子集。
例如:
[1, 2, ['hi', {'yo': 'greeting'}] ].isSubSetOf( [1, 2, ['hi', {'yo': 'greeting'}] ] ) // true;
[1, 4].isSubSetOf( [1, 2, 3] ) // false;
除了处理嵌套在数组中,嵌套在输入数组中的对象时,我目前可以在所有情况下成功返回正确的布尔值。处理对象时,我无法正确访问其键和值。我只能在登录时获取[Object,object]。这意味着,如果子集数组中的所有值除对象值之外都与索引匹配,我仍将返回true。
这是我一直在编码解决方案的方式:
Array.prototype.isSubsetOf = function (arr) {
let obj = {}
arr.forEach((element) => obj[element] = 1);
// all elements should be mapped into obj as strings
console.log('Our object, obj: ', obj);
return this.reduce( (t, ele) => !obj[ele] ? false : t, true);
// return false if element from 'this' is not present in obj, else returns t, which defaults to true as 2nd arg of reduce
};
这是应该返回false但由于未解析对象而返回true的测试:
let context = [ 'fox', 'dog', 'cow', ['sup', {'yo':'greeting'}] ]
let input = [ 'dog', 'cow', 'fox', ['sup', {'hello':'greeting'}] ]
console.log('Result: ', context.isSubsetOf(input));
我希望嵌套对象被控制台记录为字符串化的[key:value],但是:
如果在forEach和reduce之间检查对象obj的控制台日志,则嵌套对象将记录为[Object object]。此obj具有输入数组元素的非重复字符串版本。
答案 0 :(得分:0)
如果将每个元素都转换为字符串,则将对象显示为[object Object]
也就不足为奇了。一个快速的解决方法是改为在每个元素上调用JSON.stringify
,而不是隐式调用.toString()
。尽管您应注意确保键和值的顺序正确,但这将保留对象的字符串值。
下面的代码,但我确实同意建议使用DIY递归解决方案的注释,因为如果您预计需要将其适应其他任务,那么这样做将更加高效且可扩展。
Array.prototype.isSubsetOf = function (arr) {
let obj = {}
arr.forEach((element) => obj[JSON.stringify(element)] = 1);
// all elements should be mapped into obj as JSON strings
console.log('Our object, obj: ', obj);
return this.reduce( (t, ele) => !obj[JSON.stringify(ele)] ? false : t, true);
// return false if element from 'this' is not present in obj, else returns t, which defaults to true as 2nd arg of reduce
};
作为附录,如果希望对对象进行非顺序评估,则可能会使用JSON.stringify(Object.entries(eleOrElement).sort())
之类的方法,尽管这样会大大增加时间的复杂性。