使用forEach将包含嵌套对象的数组元素添加到新对象中作为键,但是对象看起来像[Object object]

时间:2019-06-28 16:39:33

标签: javascript

我正在尝试为我的训练营解决一个名为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具有输入数组元素的非重复字符串版本。

1 个答案:

答案 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())之类的方法,尽管这样会大大增加时间的复杂性。