【问题标题】:How can I reorder an ELEMENT inside of an OBJECT of an array of OBJECTS NOT sort?如何重新排序未排序的对象数组的对象内的元素?
【发布时间】:2022-01-08 11:31:11
【问题描述】:

每次搜索如何对对象数组的对象内部的元素进行重新排序(不排序)都会返回如何对数组进行排序。这不是我想要的。

这是一个退出和肮脏的例子:

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 是一个函数。

是的,我正在为一家大型电信公司工作,但仍在使用 AngularJS。无论如何,此时它只是纯 javascript。

【问题讨论】:

  • 我实际上需要移动整个 ELE NAME。所以,让我把对象修复得更清楚
  • 但是您仍然会遇到无法保留对象字段顺序的问题我们可以解决它们,但不能保证它们会保留在这些位置。
  • 请注意,全大写字母被认为是在互联网上大喊大叫。使用粗体或斜体强调,或者完全放弃格式,因为它是不必要的。

标签: javascript arrays javascript-objects


【解决方案1】:

请注意,不能保证对象字段的顺序。

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)

【讨论】:

  • Kinglish - 谢谢,但我让这个例子更清楚了。 ID 位于位置 1,我只想将其移动到位置 0。只需翻转两个即可。 HTH
  • 它只是在飞行中......一次。发生的事情是我得到的是按字母顺序排列的。为了清楚起见,我需要将实际 JSON 中的 ID 字段移动到位置 1,而不是将它放在位置 4 中。明白我吗?我想我可能需要通过重新排序来构建一个新的数组。有意义吗?
  • 更新了我的答案,如果有帮助请告诉我...
  • 嘘!谢谢!
  • @PeterTheAngularDude 如果您不想命名其他字段,obj.map( o =&gt; ({id: o.id, ...o }))
【解决方案2】:

JavaScript 对象中的属性没有明确的顺序。不过,通常情况下,它们是按照它们添加的顺序来表示的。 “重新排列”属性似乎更像是一场强迫症冒险,而不是任何事情。没有“位置 0”。

也就是说,如果我在这个强迫症任务中,我会做一些真的简单的事情:

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;
});

再一次,这一切似乎都是不必要的。我能想到这可能有意义的唯一情况是,如果您需要将数据传递给某个真正关心非序数属性“顺序”的进程(这似乎是破碎和脆弱的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多