Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何实现这个逻辑_Javascript - Fatal编程技术网

Javascript 我如何实现这个逻辑

Javascript 我如何实现这个逻辑,javascript,Javascript,我有如下的对象结构 var obj = { a : 1, b : [x,y,z], c : [0,1,3], d : ['%','-','+'] } 我想将该对象转换为以下格式 { 1 : { x : { 0 : ['%','-','+'], // Last index remains as an array 1 : ['%','-','+'], 3 : ['%','-','+'] },

我有如下的对象结构

var obj = {
   a : 1,
   b : [x,y,z],
   c : [0,1,3],
   d : ['%','-','+']
}
我想将该对象转换为以下格式

{
  1 : {
     x : {
         0 : ['%','-','+'], // Last index remains as an array
         1 : ['%','-','+'],
         3 : ['%','-','+']
     },
     y : {
         0 : ['%','-','+'], // Last index remains as an array
         1 : ['%','-','+'],
         3 : ['%','-','+']
     },
     z : {
         0 : ['%','-','+'], // Last index remains as an array
         1 : ['%','-','+'],
         3 : ['%','-','+']
     }
  }
}
如果在上述情况下,
['%'、'-'、'+']
之后还有一个属性,则相同的过程将继续

var v = {}/* Object of above */, keys = Object.keys(v), simplifiedColumns = {};
for (var i = 0, l = keys.length; i < l ; i++) {
        if (v[i] instanceof Array) {

        }else{
              simplifiedColumns[keys[i]] = simplifiedColumns[keys[i]] || {};
        }
}
var v={}/*上面的对象*/,keys=Object.keys(v),simplifiedColumns={};
对于(变量i=0,l=keys.length;i

请建议我完成这个逻辑。

这里有一个算法可以工作,但它只会为
x
y
z
创建一个对象,并引用同一个对象

另外,下面的示例假定键的顺序(由
Object.keys()
提供)与定义对象的顺序相同。情况并非总是如此,因此更好的解决方案是将对象更改为数组:

var obj = [
   {
        "key": "a",
        "value": 1
   },
   {
        "key": "b",
        "value": ["x","y","z"]
   },
   {
        "key": "c",
        "value": [0,1,3]
   },
   {
        "key": "d",
        "value": ['%','-','+']
   }
];
但无论如何,这里是使用原始对象符号的算法:

var obj = {
   a : 1,
   b : ["x","y","z"],
   c : [0,1,3],
   d : ['%','-','+']
};

var keys = Object.keys(obj);

//set tempObj to the last array
var tempObj = obj[keys[keys.length - 1]];

//traverse the rest of the keys backwards
for (var i = keys.length - 2; i >= 0; i--) {
    var key = keys[i];

    //create new empty object
    var newObj = {};

    //append "tempObj" to that object and using the keys that are in the current array
    //or if the property isn't an array, use the property itself as key
    if (Array.isArray(obj[key])) {
        for (var k = 0; k < obj[key].length; k++) {
            newObj[obj[key][k]] = tempObj;
        }
    } else {
        newObj[obj[key]] = tempObj;
    }
    //override tempObj with the new created object
    tempObj = newObj;
}
差不多

newObj[obj[key]] = copyObject(tempObj);

其中
copyObject
是一个创建对象深度副本的函数。但我想在这种情况下,性能会急剧下降,因为您要一次又一次地复制相同的对象。

请注意,
Object.keys
以任意顺序返回键,因此您可能应该在开始之前按字典顺序对键进行排序。如果我对键进行排序,那么顺序会改变,对吗?我的要求是以树状视图的方式生成它,以使算法的效率达到k^n(非常低效)。因此,在大量数据上执行此操作根本不起作用。您需要按照某种顺序对它们进行排序。Javascript中的对象是键/值对的无序集合,因此您需要给它们一个已定义的顺序,以使您的输出得到良好定义。例如,可以
x
y
引用相同的对象吗?keys.sort()导致不需要的结果..:(如果我删除排序,它对我来说工作正常…@删除排序时的异常依赖于未定义的行为,这在某些Javascript实现中恰好正常工作。它可能不会在大多数版本的Chrome中工作,但它不是Chrome中的一个bug。这是因为您将对象视为具有顺序。您应该能够稍微重写代码,这样就可以在所有Javascript引擎中获得定义良好的行为。@Paulpro我不明白。为什么要
sort()
,应用于数组,会导致任何问题吗?@Exception您得到的这些不需要的结果到底是什么?好的,那么您可能有一个类似于
{“foo”:{..},“bar”:{…},“yoo”:{…}
您希望按照对象中定义的顺序处理属性。对吗?问题是,不能保证密钥的顺序。因此,剩下的唯一方法是按照Paulpro的建议,使用数组而不是对象。
newObj[obj[key]] = copyObject(tempObj);