Javascript 如何清理空数组对象并对其重新编号?
我有一个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
{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位值,如数组索引)首先排序。