【问题标题】:How to run functions in custom nested objects and arrays in javascript如何在javascript中的自定义嵌套对象和数组中运行函数
【发布时间】:2016-10-14 05:39:33
【问题描述】:

我目前正在尝试多种方法在 javascript 中对此进行评估:

var commands = [
  {
    func: "repeat",
    times: 3,
    actions: [
      {
        func: "func",
        callback: function() {
          console.log("one");
        },
      },
    ],
  }, {
    func: "func",
    callback: function() {
      console.log("two");
    },
  }, {
    func: "repeat",
    times: 2,
    actions: [
      {
        func: "func",
        callback: function() {
          console.log("three");
        },
      }, {
        func: "repeat",
        times: 3,
        actions: [
          {
            func: "func",
            callback: function() {
              console.log("four");
            },
          },
        ],
      },
    ],
  }, 
];

但我仍然停留在嵌套重复命令的部分,以及我希望从该命令数组的顶部到底部解析的结果。

如何评估这个数组?有没有与此相关的好资源?

(假设数组中的每个值都必须是对象并且至少有一个键“func”)

编辑:预期结果http://pastebin.com/Chd6DLdB

【问题讨论】:

  • 预期输出是什么?
  • 尝试使用 'func' 键和 'callback' 值创建一个对象;但是键必须是唯一的,例如只能有一个对象 => {func: "func",callback:fn(){...}}
  • var obj={};$.each(commands,function(i,c){obj[c.func]=c}) 在迭代函数中运行它以创建该对象
  • 预期结果可能太长,无法在此处发布

标签: javascript arrays loops object


【解决方案1】:

你可以有一个递归函数来循环搜索actionscallbacks然后处理。

function callCommands(obj) {
  // Check if received object is an array. If yes, loop over them
  if (Array.isArray(obj)) {
    obj.forEach(callCommands)
  } 
  // If received object is not an array, check if it has a property `callback`. If yes, call it.
  // Also check if it has `actions`. If yes, loop over and process them as well
  else if (typeof obj === 'object') {
    if (obj.hasOwnProperty('callback')) {
      obj['callback']();
    }
    if (obj.hasOwnProperty('actions'))
      callCommands(obj['actions'])
  }
}

var commands = [{
  func: "repeat",
  times: 3,
  actions: [{
    func: "func",
    callback: function() {
      console.log("one");
    },
  }, ],
}, {
  func: "func",
  callback: function() {
    console.log("two");
  },
}, {
  func: "repeat",
  times: 2,
  actions: [{
    func: "func",
    callback: function() {
      console.log("three");
    },
  }, {
    func: "repeat",
    times: 3,
    actions: [{
      func: "func",
      callback: function() {
        console.log("four");
      },
    }, ],
  }, ],
}, ];

function callCommands(obj) {
  if (Array.isArray(obj)) {
    obj.forEach(callCommands)
  } else if (typeof obj === 'object') {
    if (obj.hasOwnProperty('callback')) {
      obj['callback']();
    }
    if (obj.hasOwnProperty('actions'))
      callCommands(obj['actions'])
  }
}

callCommands(commands)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2012-06-22
    • 2018-02-25
    • 2019-09-30
    相关资源
    最近更新 更多