将对象数据传递给上层对象属性

时间:2017-11-23 00:40:50

标签: javascript algorithm

我有一个下面的数组列表,想要从下到上分配一个值。

代码示例:

var tempArrayList=[
{org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:null,org2:null,org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:null,org2:"Office",org3:null,org4:null,org5:"Pay"},
{org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:"head1",org2:null,org3:null,org4:"Payroll",org5:"Pay"}
];

for(var i=0;i<tempArrayList.length;i++) {   
    var temp=tempArrayList[i];
    var org1=temp.org1;
    var org2=temp.org2;
    var org3=temp.org3;
    var org4=temp.org4;
    var org5=temp.org5;

    document.write(JSON.stringify(temp));
    document.writeln("<br>");  
}

我的问题:如何将org2值设置为org1,org3值设置为org2 ......

  

//如果org1为null,则temp.org1 = temp.org2,temp.org2 = temp.org3,temp.org3 = temp.org4,temp.org4 = temp.org5

     

//如果org1和org2为null,那么temp.org1 = temp.org3,temp.org2 = temp.org4,temp.org3 = temp.org5,temp.org4 = null

3 个答案:

答案 0 :(得分:1)

过滤掉value数组中的所有null,然后循环遍历键并分配过滤值或null

var tempArrayList=[
{org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:null,org2:null,org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:null,org2:"Office",org3:null,org4:null,org5:"Pay"},
{org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:"head1",org2:null,org3:null,org4:"Payroll",org5:"Pay"}
];

tempArrayList.forEach((o) => { 
   const vals = Object.values(o).filter(v => v);           
   Object.keys(o).forEach((key, i) => o[key] = vals[i] || null);
});



console.log(tempArrayList)
.as-console-wrapper {max-height:100%!important;}

答案 1 :(得分:1)

对于假值({org1:false}),接受的答案失败,改变原始对象并错误地假定Object.keys按特定顺序返回。

订单Object.keys无法保证以正确的顺序返回键数组:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

  

的顺序与for ... in循环

的顺序相同

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

  

for ... in循环以任意顺序迭代对象的属性

如果Object.keys的代码有效,请再次尝试,但先添加:

tempArrayList = tempArrayList.map(
  x => 
    Object.keys(x).reverse().reduce(
      (acc,key) => {acc[key]=x[key];return acc;}
      ,{}
    )
);

这是一个不依赖于Object.keys顺序的问题的解决方案,不会变异,也不会对假成员值失败:

&#13;
&#13;
const collapse = function(direction,reason,subject,seed,keys){
  if(Array.isArray(subject)){
    keys = (function(x){
      const ret = [];
      while(++x<subject.length){
        ret.push(x);
      }
      return ret;
    }(-1));
  }
  keys =
  (direction>0)
    ? keys
    : keys.reverse();
  const sortedKeys = keys.filter(
    function(key){return !reason(subject[key])}
  ).concat(
    keys.filter(
      function(key){return reason(subject[key])}
    )
  );
  return keys.reduce(
    function(acc,key,index) {
      acc[key] = subject[sortedKeys[index]]
      return acc;
    }
    ,seed
  );
}

const collapseLeft = function(reason,keys){
  return function(seed,subject){
    return collapse(1,reason,subject,seed,keys);
  }
};

const collapseRight = function(reason,keys){
  return function(seed,subject){
    return collapse(-1,reason,subject,seed,keys);
  }
};


const tempArrayList=[
  {org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
  {org1:null,org2:null,org3:"HR",org4:"Payroll",org5:"Pay"},
  {org1:null,org2:"Office",org3:null,org4:null,org5:"Pay"},
  {org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
  {org1:"head1",org2:null,org3:"Pay",org4:null,org5:null}
  ];  
const isNull = function(x){return x===null;};
console.log(
  tempArrayList.map(
    function(item){
      //seed can be an object ({}) or array ([]) see other log
      return collapseLeft(
        isNull,
        ["org1", "org2", "org3", "org4", "org5"]
      )
      ({},item);
    }
  )
);

//collapse right example
console.log(
  JSON.stringify(
    collapseRight(
      isNull,
      ["org1", "org2", "org3", "org4", "org5"]
    )({},{org1:"head1",org2:null,org3:"Pay",org4:null,org5:null})
    ,undefined
    ,2
  )
);

//array example (seed is [])
console.log(
  JSON.stringify(
    collapseRight(isNull)([],[1,2,3,null,4,null,5])
    ,undefined
    ,2
  )
);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

这是你要找的吗?

此代码遍历对象键,向上移动值并将最后一个值设置为null

var tempArrayList=[
{org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:null,org2:null,org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:null,org2:"Office",org3:null,org4:null,org5:"Pay"},
{org1:null,org2:"Office",org3:"HR",org4:"Payroll",org5:"Pay"},
{org1:"head1",org2:null,org3:null,org4:"Payroll",org5:"Pay"}
];

for (var i = 0; i < tempArrayList.length; i++) {
    var keys = Object.keys (tempArrayList[i]);
    for (var j = 0; j < keys.length; j++) {
        if (j < keys.length - 1) {
            tempArrayList[i][keys[j]] = tempArrayList[i][keys[j + 1]];
        } else {
            tempArrayList[i][keys[j]] = null;
        }
    }
}