Javascript 如何清理空数组对象并对其重新编号?

Javascript 如何清理空数组对象并对其重新编号?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个JavaScript对象,比如 {0: [], 1: [0: 'a', 1: 'b'], 2: [], 3: [0: '20']} 我想去掉这个对象中的空插槽,并对剩余的插槽重新编号,使其具有正常顺序(0、1、2) 我使用此功能: function clean(obj) { for (var propName in obj) { if (obj[propName] === null || obj[propName].length == 0 || obj[prop

我有一个JavaScript对象,比如

{0: [], 1: [0: 'a', 1: 'b'], 2: [], 3: [0: '20']}
我想去掉这个对象中的空插槽,并对剩余的插槽重新编号,使其具有正常顺序(0、1、2)

我使用此功能:

function clean(obj) {
    for (var propName in obj) {
        if (obj[propName] === null || obj[propName].length == 0 || obj[propName] === undefined) {
            delete obj[propName];
        }
    }
}
它清除了物体,但我得到了

{1: [0: 'a', 1: 'b'], 3: [0: '20']}

但是如何将1与0和3与1相加?

我建议使用
数组
而不是
对象
,但您可以这样做:

var obj={0:[],1:['a',b',2:[],3:['20']};
var newObj=Object.keys(obj).reduce(函数(acc,k){
var objVal=obj[k];
if(对象长度){
acc[对象键(acc).length]=对象值;
}
返回acc;
}, {});

console.log(newObj)
我建议使用
数组
而不是
对象
,但您可以这样做:

var obj={0:[],1:['a',b',2:[],3:['20']};
var newObj=Object.keys(obj).reduce(函数(acc,k){
var objVal=obj[k];
if(对象长度){
acc[对象键(acc).length]=对象值;
}
返回acc;
}, {});

console.log(newObj)假设数组是属性,您可以按长度筛选(使用a)并将此数组分配给对象

var data={0:[],1:['a',b'],2:[],3:['20']},
clean=Object.assign({},Object.values(data.filter)({length}=>length));

控制台日志(干净)假设数组是属性,您可以按长度筛选(使用a)并将此数组分配给对象

var data={0:[],1:['a',b'],2:[],3:['20']},
clean=Object.assign({},Object.values(data.filter)({length}=>length));

控制台日志(干净)假设索引值是隐式的

const数据={
0: [],
1:[a'、[b'],
2: [],
3: ['20']
}
const newData={};
for(数据中的常量属性){
if(数据[属性].length!==0){
newData[属性]=数据[属性]
}
}

console.log(newData)
假设索引值是隐式的

const数据={
0: [],
1:[a'、[b'],
2: [],
3: ['20']
}
const newData={};
for(数据中的常量属性){
if(数据[属性].length!==0){
newData[属性]=数据[属性]
}
}

console.log(newData)
这是我的建议。也不要在数组声明中使用索引:
[0:'a',1:'b']
应该是
['a','b']

const data = {0: [], 1: ['a', 'b'], 2: [], 3: ['20']};

const dataArray = Object.values(data);
let result = {};
let index = 0;

dataArray.forEach(d => {
  if (d.length) Object.assign(result, {[index++]: d});
})

// result --> {0: ['a', b'], 1: ['20']}

这是我的建议。也不要在数组声明中使用索引:
[0:'a',1:'b']
应该是
['a','b']

const data = {0: [], 1: ['a', 'b'], 2: [], 3: ['20']};

const dataArray = Object.values(data);
let result = {};
let index = 0;

dataArray.forEach(d => {
  if (d.length) Object.assign(result, {[index++]: d});
})

// result --> {0: ['a', b'], 1: ['20']}

首先,您的问题有一个问题,因为第一个对象的定义没有通过JS编译。数组元素被赋予一个带有索引的“键”,您写道<代码>1:[0:'a',1:'b']
应该是:

1: {0: 'a', 1: 'b'}

显然,您混淆了数组的索引和对象的

在这里,您将为对象键提供其数组中索引的名称。所以,也许你问的是三个问题中的一个。(我会一一回答):

保持函数完整性的最快方法是在函数底部添加一个新的“索引器”,更正键。我们可以按如下方式使用ES6:

 // if to delete...
 let oldKey = paramName;
 let newKey = (obj.keys().indexOf(oldKey)) - 1;
 delete obj[oldKey].assign(o, {[newKey]: o[oldKey] })[oldKey];
这不是很清楚

最清晰的方法是使用另一个对象,并且仅当原始元素有一个值时才填充下一个元素,从索引零开始并增加它

function cleanup(obj) {
  let newObj = {};
  let idx = 0;
  for (var propName in obj) {
    let prop = obj[propName];
    console.log('prop', propName, JSON.stringify(prop))

    if (prop !== null 
     && prop !== undefined
     && JSON.stringify(prop) != "[]" // not empty array
     && JSON.stringify(prop) !== "{}") { // not empty obj
      newObj[idx] = prop;
      idx++;
    }
  }
  return newObj; 
}

您还可以使用对象的keys()方法按从迭代器中获取的顺序获取keyname数组。对于阵列,可以使用拼接(0,idx)将该元素移出


或者您可以使用split,但是您必须“向后”工作,否则for循环将无法正常工作。因此,首先获得道具名称,然后从最后一个到第一个弹出窗口

首先,您的问题有一个问题,因为第一个对象的定义没有通过JS编译。数组元素被赋予一个带有索引的“键”,您写道<代码>1:[0:'a',1:'b']
应该是:

1: {0: 'a', 1: 'b'}

显然,您混淆了数组的索引和对象的

在这里,您将为对象键提供其数组中索引的名称。所以,也许你问的是三个问题中的一个。(我会一一回答):

保持函数完整性的最快方法是在函数底部添加一个新的“索引器”,更正键。我们可以按如下方式使用ES6:

 // if to delete...
 let oldKey = paramName;
 let newKey = (obj.keys().indexOf(oldKey)) - 1;
 delete obj[oldKey].assign(o, {[newKey]: o[oldKey] })[oldKey];
这不是很清楚

最清晰的方法是使用另一个对象,并且仅当原始元素有一个值时才填充下一个元素,从索引零开始并增加它

function cleanup(obj) {
  let newObj = {};
  let idx = 0;
  for (var propName in obj) {
    let prop = obj[propName];
    console.log('prop', propName, JSON.stringify(prop))

    if (prop !== null 
     && prop !== undefined
     && JSON.stringify(prop) != "[]" // not empty array
     && JSON.stringify(prop) !== "{}") { // not empty obj
      newObj[idx] = prop;
      idx++;
    }
  }
  return newObj; 
}

您还可以使用对象的keys()方法按从迭代器中获取的顺序获取keyname数组。对于阵列,可以使用拼接(0,idx)将该元素移出


或者您可以使用split,但是您必须“向后”工作,否则for循环将无法正常工作。因此,首先获得道具名称,然后从最后一个到第一个弹出窗口

将对象视为数组似乎很奇怪。是否有可能创建这样的对象-
{1:[0:a',1:b']}
?@planet_hunter不,将对象视为数组会引发语法错误似乎很奇怪。是否有可能创建这样的对象-
{1:[0:a',1:b']}
,它会抛出一个语法错误Hi Nina,很好的解决方案,你能评论一下这个语句中的逻辑吗?
({length})
?它是一个,意味着将对象的属性作为变量。将
对象。
值总是保证正确的顺序吗?@MarkMeyer,即所谓的整数索引键(正32位值,如数组索引)首先排序。