【问题标题】:Javascript: Sorting Objects ChallengeJavascript:排序对象挑战
【发布时间】:2013-10-28 01:03:45
【问题描述】:

我有点挑战。我正在使用 javascript 开发物理应用程序。使用的两个主要对象是

var force = new Object();
var torque = new Object();
with properties
force.magnitude = newArray();
force.lengthfromorigin = new Array();
force.count;
torque.lengthfromorigin= new Array();
torque.count;

现在,我想将这两个对象根据它们各自的 lengthfromorigins 排序到一个数组中

示例:force.lengthfromorigin = [5,8] 和 torque.lengthfromorigin=[2,6] 所以他们在这个 newArray 中的顺序是 [ torque[0], force[0], torque[1], force[1] ]

我的问题是否有可能拥有一个按其各自属性排序的不同对象的数组,然后在函数中使用该数组,该函数将根据索引处的对象做出决定。我还需要在每个对象中都有一个 id 属性来识别对象是扭矩还是力。

例子:

if(newArray[i] == torque)
    //do stuff
else
    //do other stuff.

【问题讨论】:

  • 1) 可能,2) 请在下一个示例中使用您的第一个示例
  • 我认为你试图一次解决太多问题。我会先编写一个整数数组的排序方法,然后从那里开始。
  • 它的伪代码@PsychHalf ...

标签: javascript arrays sorting object multidimensional-array


【解决方案1】:

大概是这样的吧?

让我解释一下算法:

  1. 创建一个新数组,将其命名为 A
  2. 对于objects中的每个对象:

    2.1 让当前对象被称为obj

    2.2 使用map 生成一个名为 tuples 的新数组,其中包含 [obj, num] 个元组 对于每个lengthFromOrigin obj 的数量。

    3.3 将元组的所有项推入A

  3. tuple[1](即数字)升序对 A 进行排序。

var objects = [
        { type: 'force', lengthFromOrigin: [5, 8] },
        { type: 'torque', lengthFromOrigin: [2, 6] }
    ],
    sorted = objects.reduce(function (arr, obj) {
        arr.push.apply(arr, obj.lengthFromOrigin.map(function (num) {
            return [obj, num];
        }));

        return arr;           
    }, []).sort(function (a, b) {
        return a[1] - b[1];    
    });

console.log(sorted);

然后您可以遍历sorted,并通过查看元组中的第一个元素轻松识别它是 torque 还是 force

sorted.forEach(function (tuple) {
    console.log(tuple[0].type, tuple[1]);
});

//torque 2
//force 5
//torque 6
//force 8 

【讨论】:

  • @bala,如果您打算经常这样做,您显然可以将算法封装在一个函数中;)
【解决方案2】:

答案是是的

但是您必须在访问它们的属性之前识别每个对象。在您的情况下,这两个对象都有一个名为 lengthfromorigin 的共同属性,可用于对它们进行正确排序。

要识别每个对象,您可以使用 IDName 等属性。

if(Mydata[i].Name = 'torque'){
  //your code goes here
}
else if(Mydata[i].Name = 'force'){
  //your code goes here
}

希望对你有帮助

【讨论】:

  • 为什么不直接使用面向对象的原则,并在每个可以执行该类型对象所需代码的对象类型上放置一个通用命名的方法,这样您就不必查看它是什么类型了?
猜你喜欢
  • 2018-01-21
  • 2021-06-04
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
相关资源
最近更新 更多