json 如何在不传递回调函数的情况下将嵌套对象属性作为选项传递?

bz4sfanl  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(114)

我正在编写一个简单的jQuery插件,它将与JSON对象/数组接口。我想让这个对象数组足够灵活,这样人们就可以将自己的对象数组传递给插件函数。我希望用户能够通知插件如何在JSON对象中获得两个不同的值。例如,假设这是JSON --

[
    {
      name: "Baseball Opening Day",
      format: "jpg",
      urls: {
        small: "http://myurl.com/images/small/baseball.jpg",
        big: "http://myurl.com/images/big/baseball.jpg"
      }
    },

    // etc.
]

字符串
如果插件“知道”它将被传递一个图像对象数组,但这些图像对象可能以多种方式格式化,我们如何传递一个选项来告诉它在哪里找到各种东西?例如,如果我想显示一个标题,我会要求一个对标题值的引用。这个比较简单:

$("gallery").myPlugin({
  references: {
    caption: "name"
  }
});


在插件中,我们可以得到如下的值,一旦我们循环遍历收集的图像对象:

// Assuming the value passed in is called "options"...
var caption = image[options.references.caption];


这将被解释为image[“name”],它与image.name相同,并且工作正常。
但是你如何告诉插件如何进入image.urls.small呢?你不能这样做:

$("gallery").myPlugin({
  references: {
    caption: "name",
    urlSmall: "urls.small"
  }
});


因为它将被解释为image[“urls.small”]并返回undefined
有办法通过吗?或者在这一点上,我必须使用一个回调函数,像这样:

$("gallery").myPlugin({
  references: {
    caption: "name",
    urlSmall: function () {
      return this.urls.small;
    }
  }
});

// Call it like this inside the plugin image loop
var urlSmall = options.references.urlSmall.call( image );


我知道这是一个选项,但我想知道是否有一种方法可以避免强迫用户编写回调函数,如果他们可以传递一个对嵌套对象属性的引用,以某种方式?
谢谢你,谢谢

nr9pn0ug

nr9pn0ug1#

您只需要一个方法来拆分这些属性名。给你点东西让你开始。

/**
 * Naïve implementation, does not handle null or bracket access
 */
function getProp(obj, propName) {
  var parts = propName.split('.');

  for (var i = 0; i < parts.length; i++) {
    obj = obj[parts[i]];
  }
  return obj;
}

var a = { b: { c: 2 } };

console.log(getProp(a, 'b.c')) // 2
console.log(getProp(a, 'd.e')) // Error
console.log(getProp(a, 'd["e"]')) // Just wrong

字符串
在插件中,您可以使用

// Assuming the value passed in is called "options"...
var caption = getProp( image, 'options.references.caption' );


Lodash的_.get可以像其他工具库一样正确地处理所有角落的情况。

相关问题