在一个深层对象中按名称查找属性。

14 浏览
0 Comments

在一个深层对象中按名称查找属性。

我有一个庞大的集合,我想要通过键在集合中某个位置找到一个属性。有什么可靠的方法可以获取包含该键/索引的所有对象的引用或完整路径的列表?如果有需要的话,我会使用jQuery和lodash,而且你可以忽略无限指针递归,因为这是一个纯JSON响应。

fn({ 'a': 1, 'b': 2, 'c': {'d':{'e':7}}}, "d");

// [o.c]

fn({ 'a': 1, 'b': 2, 'c': {'d':{'e':7}}}, "e");

// [o.c.d]

fn({ 'aa': 1, 'bb': 2, 'cc': {'d':{'x':9}}, dd:{'d':{'y':9}}}, 'd');

// [o.cc,o.cc.dd]

顺便说一句,lodash有一个_.find函数,可以找到两层嵌套的对象,但在此之后似乎会失败(例如,http://codepen.io/anon/pen/bnqyh)。

0
0 Comments

在这段代码中,问题的原因是需要在一个深层对象中根据属性名查找属性。然而,原始的解决方法只能处理对象,不能处理嵌套的数组。为了解决这个问题,我们需要更新解决方法,使其能够处理嵌套的数组。

解决方法是使用递归来遍历对象,并在每一层检查属性名是否匹配。如果匹配,则将属性值添加到结果数组中。如果属性值是一个数组或对象,则通过递归调用自身来处理嵌套层级。

下面是更新后的解决方法的代码:

function findNested(obj, key, memo) {
  var i,
      proto = Object.prototype,
      ts = proto.toString,
      hasOwn = proto.hasOwnProperty.bind(obj);
  if ('[object Array]' !== ts.call(memo)) memo = [];
  for (i in obj) {
    if (hasOwn(i)) {
      if (i === key) {
        memo.push(obj[i]);
      } else if ('[object Array]' === ts.call(obj[i]) || '[object Object]' === ts.call(obj[i])) {
        findNested(obj[i], key, memo);
      }
    }
  }
  return memo;
}

使用这个更新后的函数的示例代码如下:

findNested({'aa': 1, 'bb': 2, 'cc': {'d':{'x':9}}, dd:{'d':{'y':9}}}, 'd');

上述代码的结果将是:

[{x: 9}, {y: 9}]

现在,更新后的解决方法可以处理嵌套的数组,并能够正确返回结果。

0
0 Comments

问题:如何在一个深层对象中根据名称找到属性?

在这个讨论中,有人提供了一个函数fn,用于在一个深层对象中根据名称查找属性。函数的实现使用了lodash库。该函数首先检查给定的对象是否包含指定的属性,如果包含则返回该对象。如果不包含,则递归地遍历对象的所有属性,查找所有包含指定属性的对象,并将它们保存在一个数组中返回。

然后,某些情况下在某些情况下这个函数不起作用,需要将第3行的代码改为return [obj[key]];,以便返回属性的值而不是包含该属性的对象。

另一个人提到,该函数的实现满足了其所有的需求,而另一个回答则在处理嵌套的数组对象时出现问题。

之后,有人问到res.push(v)res.push.apply(res, v);之间的区别。其中一个参与讨论的人回答说,res.push(v)是将一个元素添加到数组,而res.push.apply(res, v);是将多个元素一次性添加到数组中。他还提供了一些关于apply函数的链接供参考。

接下来,某些情况下自己对.push()的理解有误,并感谢前面参与讨论的人对这一点的解释。另一个人补充说,concat()方法可以用于合并数组,但是对于非数组的值,push.apply()会抛出错误。

最后,有人问是否可以修改函数,以便可以根据指定的属性值来查找对象。其中一个参与讨论的人回答说,可以将has检查替换为任何你想要测试的条件。

最后,某些情况下在浏览器中运行该函数时出现错误,可能是因为没有加载lodash库。

该问题的原因是需要在一个深层对象中根据名称查找属性,解决方法是使用递归遍历对象的属性,并将包含指定属性的对象保存在数组中返回。此外,还讨论了使用lodash库、修改函数以支持根据属性值查找对象以及在浏览器中运行函数时可能遇到的错误。

0
0 Comments

在上述代码中,我们可以看到一个名为search的函数。该函数接受三个参数:hay(被搜索的对象数组),needle(要查找的属性名),accumulator(累加器)。

该函数的目的是在深层对象数组中按属性名查找属性,并返回包含结果的数组。

在函数的实现中,首先定义了一个默认值为[]的累加器accumulator。然后,通过判断hay的类型是否为对象,来决定如何处理。如果hay是对象,就遍历对象的属性,并对每个属性递归调用search函数,传入属性的值和needle,并将结果进行判断。如果返回的结果为true,就将当前对象hay添加到accumulator中。最后,使用正则表达式来测试hay是否匹配needle,如果匹配则返回true,否则返回accumulator。

上述代码是可读性较强的,并且没有进行代码压缩。它使用了简洁的英语命名,但是对理解来说需要一定的智力。

该代码已经进行过编辑。可以在原始修订版本中查看更改内容。

根据以上内容,我们可以得出以下结论:

问题的出现原因:在一个深层对象数组中查找特定属性名的属性值。

解决方法:使用递归函数来遍历深层对象数组,并通过判断属性值是否匹配目标属性名来返回结果数组。

0