如何重新排序 OBJECTS NOT sort 数组的 OBJECT 内的 ELEMENT?
How can I reorder an ELEMENT inside of an OBJECT of an array of OBJECTS NOT sort?
每次搜索如何重新排序(不排序)对象数组的对象内的元素时,都会返回如何对数组进行排序。这不是我想要的。
这是一个简单粗暴的例子:
let obj = [
{
name: "hi number 1a",
id: "hi number 2a",
address: "hi number 3a"
}, {
name: "hi number 1b",
id: "hi number 2b",
address: "hi number 3b"
}, {
name: "hi number 1c",
id: "hi number 2c",
address: "hi number 3c"
}, {
name: "hi number 1d",
id: "hi number 2d",
address: "hi number 3d"
}
]
我想做的是遍历所有对象并重新排序它们,这样 id 现在就在所有对象的名称位置,如下所示:
let obj = [
{
id: "hi number 2a",
name: "hi number 1a",
address: "hi number 3a"
}, {
id: "hi number 2b",
name: "hi number 1b",
address: "hi number 3b"
}, {
id: "hi number 2c",
name: "hi number 1c",
address: "hi number 3c"
}, {
id: "hi number 2d",
name: "hi number 1d",
address: "hi number 3d"
}
]
这是我试过的代码:
$scope.arraymove = (arr, fromindex, toindex) => {
let len = arr.length;
let newArr = [];
let resultArr = [];
for (let i = 0; i < len; i++) {
resultArr[i] = move(arr[i], fromindex, toindex);
newArr.push(resultArr[i]);
}
function move(thearr, old_index, new_index) {
while (old_index < 0) {
old_index += len;
}
while (new_index < 0) {
new_index += len;
}
if (new_index >= len) {
var k = new_index - len;
while ((k--) + 1) {
thearr.push(undefined);
}
}
thearr.splice(new_index, 0, thearr.splice(old_index, 1)[0]); // CODE DIES HERE
console.log("NEW ARRAY: ", thearr);
return thearr;
}
console.log("New Reordered ARRAY: ", newArr);
return newArr;
}
发生的情况是 INCOMING arr 丢失了 SCOPE,当它遇到 splice 时,我得到 SPLICE is a function。
是的,我在一家仍在使用 AngularJS 的大型电信公司工作。反正到这里就纯粹了javascript
给你,但请注意不能保证对象字段顺序。
let obj = [
{
name: "hi number 1a",
id: "hi number 2a",
address: "hi number 3a"
}, {
name: "hi number 1b",
id: "hi number 2b",
address: "hi number 3b"
}, {
name: "hi number 1c",
id: "hi number 2c",
address: "hi number 3c"
}, {
name: "hi number 1d",
id: "hi number 2d",
address: "hi number 3d"
}
]
let newobj = obj.map( o => ({id: o.id, name: o.name, address: o.address}));
console.log(newobj)
JavaScript 个对象中的属性没有明确的顺序。但通常情况下,它们是按照添加的顺序表示的。 “重新排列”属性 似乎 更像是强迫症冒险。没有“位置 0”。
就是说,如果我在这个 OCD 任务中,我会做一些真正简单的事情:
let obj = [
{
name: "hi number 1a",
id: "hi number 2a",
address: "hi number 3a"
}, {
name: "hi number 1b",
id: "hi number 2b",
address: "hi number 3b"
}, {
name: "hi number 1c",
id: "hi number 2c",
address: "hi number 3c"
}, {
name: "hi number 1d",
id: "hi number 2d",
address: "hi number 3d"
}
];
obj = obj.map(function(instance){
return {
id: instance.id,
name: instance.name,
address: instance.address
}
});
请注意,这会将您的对象替换为具有所需顺序的新对象。如果您的应用程序引用了任何旧对象,这可能是不可取的。
如果您希望保持对象引用不变,您可以改为使用 forEach() 数组,复制属性,删除它们,然后重新分配。像这样:
obj.forEach(function(instance){
let temp = {
id: instance.id,
name: instance.name,
address: instance.address
};
delete instance.id;
delete instance.name;
delete instance.address;
instance.id = temp.id;
instance.name = temp.name;
instance.address = temp.address;
});
不过,这一切似乎都是不必要的。我能想到的唯一可能有意义的情况是,如果您需要将数据传递给某个真正关心非序数属性“顺序”的进程(这似乎是破碎和脆弱的)。
每次搜索如何重新排序(不排序)对象数组的对象内的元素时,都会返回如何对数组进行排序。这不是我想要的。
这是一个简单粗暴的例子:
let obj = [
{
name: "hi number 1a",
id: "hi number 2a",
address: "hi number 3a"
}, {
name: "hi number 1b",
id: "hi number 2b",
address: "hi number 3b"
}, {
name: "hi number 1c",
id: "hi number 2c",
address: "hi number 3c"
}, {
name: "hi number 1d",
id: "hi number 2d",
address: "hi number 3d"
}
]
我想做的是遍历所有对象并重新排序它们,这样 id 现在就在所有对象的名称位置,如下所示:
let obj = [
{
id: "hi number 2a",
name: "hi number 1a",
address: "hi number 3a"
}, {
id: "hi number 2b",
name: "hi number 1b",
address: "hi number 3b"
}, {
id: "hi number 2c",
name: "hi number 1c",
address: "hi number 3c"
}, {
id: "hi number 2d",
name: "hi number 1d",
address: "hi number 3d"
}
]
这是我试过的代码:
$scope.arraymove = (arr, fromindex, toindex) => {
let len = arr.length;
let newArr = [];
let resultArr = [];
for (let i = 0; i < len; i++) {
resultArr[i] = move(arr[i], fromindex, toindex);
newArr.push(resultArr[i]);
}
function move(thearr, old_index, new_index) {
while (old_index < 0) {
old_index += len;
}
while (new_index < 0) {
new_index += len;
}
if (new_index >= len) {
var k = new_index - len;
while ((k--) + 1) {
thearr.push(undefined);
}
}
thearr.splice(new_index, 0, thearr.splice(old_index, 1)[0]); // CODE DIES HERE
console.log("NEW ARRAY: ", thearr);
return thearr;
}
console.log("New Reordered ARRAY: ", newArr);
return newArr;
}
发生的情况是 INCOMING arr 丢失了 SCOPE,当它遇到 splice 时,我得到 SPLICE is a function。
是的,我在一家仍在使用 AngularJS 的大型电信公司工作。反正到这里就纯粹了javascript
给你,但请注意不能保证对象字段顺序。
let obj = [
{
name: "hi number 1a",
id: "hi number 2a",
address: "hi number 3a"
}, {
name: "hi number 1b",
id: "hi number 2b",
address: "hi number 3b"
}, {
name: "hi number 1c",
id: "hi number 2c",
address: "hi number 3c"
}, {
name: "hi number 1d",
id: "hi number 2d",
address: "hi number 3d"
}
]
let newobj = obj.map( o => ({id: o.id, name: o.name, address: o.address}));
console.log(newobj)
JavaScript 个对象中的属性没有明确的顺序。但通常情况下,它们是按照添加的顺序表示的。 “重新排列”属性 似乎 更像是强迫症冒险。没有“位置 0”。
就是说,如果我在这个 OCD 任务中,我会做一些真正简单的事情:
let obj = [
{
name: "hi number 1a",
id: "hi number 2a",
address: "hi number 3a"
}, {
name: "hi number 1b",
id: "hi number 2b",
address: "hi number 3b"
}, {
name: "hi number 1c",
id: "hi number 2c",
address: "hi number 3c"
}, {
name: "hi number 1d",
id: "hi number 2d",
address: "hi number 3d"
}
];
obj = obj.map(function(instance){
return {
id: instance.id,
name: instance.name,
address: instance.address
}
});
请注意,这会将您的对象替换为具有所需顺序的新对象。如果您的应用程序引用了任何旧对象,这可能是不可取的。
如果您希望保持对象引用不变,您可以改为使用 forEach() 数组,复制属性,删除它们,然后重新分配。像这样:
obj.forEach(function(instance){
let temp = {
id: instance.id,
name: instance.name,
address: instance.address
};
delete instance.id;
delete instance.name;
delete instance.address;
instance.id = temp.id;
instance.name = temp.name;
instance.address = temp.address;
});
不过,这一切似乎都是不必要的。我能想到的唯一可能有意义的情况是,如果您需要将数据传递给某个真正关心非序数属性“顺序”的进程(这似乎是破碎和脆弱的)。