2017-09-06 19 views
0

对于array我可以这样做:如何通过类似数组的对象的键来移动值?

array.push(array.shift()) 

var array = [0, 1, 2, 3, 4, 5]; 
 
array.push(array.shift()) 
 

 
console.log(array); // [1, 2, 3, 4, 5, 0]

我如何做一个object一样吗?

输入

var object = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'} 

我怎样才能移动{0: 'Fiat'}object

预期输出的末尾:

{0: 'Audi', 1: 'BMW', 2: 'Citroën', 3: 'Fiat'} 
+0

我不想按键排序JavaScript对象。 – Red

+0

但答案是一样的:“JavaScript对象1没有排序,尝试对它们进行”排序“是没有意义的。 –

+0

你想对它进行排序,重点是没有订单的对象 –

回答

4

您可以使用以下方式

var object = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'}; 
 

 
var result = Object.keys(object).map(e => object[e]); 
 
//console.log(result); 
 

 
result.push(result.shift()); 
 
//console.log(result); 
 

 
let ans = Object.assign({}, result); 
 
console.log(ans);

+0

我会试试这个。听起来是合乎逻辑的将其转换为数组。我的对象拥有jQuery元素。所以idk如果可行的话。我会告诉你。 – Red

+0

好的,谢谢。这个对我有用。 – Red

+0

问题是,为什么它以这种方式工作,仅映射项目? –

1

对象的属性不会对任何保证订单,他们可能会应用耳朵,简洁,没有概念作为命令。我认为你需要考虑更多,并可以找到另一个解决方案,而不依赖于属性顺序。

+0

这意味着它不可能用于对象吗? – Red

+0

您可以删除您的房产,并将其添加到最后的房产编号+ 1下,但您还需要更改其余房产。尝试找到一个数组的解决方案,因为你的对象更像是一个数组 –

0

您不应该依赖JavaScript中对象的按键顺序。它不是由标准定义的。对象根据定义没有排序,所以有没有“结束”的对象。在任何地方“移动”某个对象的关键点根本没有意义,因为没有排序。

确实有数据结构有命令是数组。

您的对象是差不多类似数组,因为它的所有密钥都是连续的数字,但它缺少lenght属性。使用length,您可以将其转换为Array.from(object)的实际数组。

0

教学:对象通常是基于Hash table通过键查找。 因此,这通常意味着您没有订单。

myObj[key] => find value by computing hash of key => returns value 
2

您可以将给定键的对象转换为数组的索引,应用移位并将其转换回对象。

var object = { 0: 'Fiat', 1: 'Audi', 4: 'BMW', 5: 'Citroën' }, 
 
    array = Object.keys(object).reduce((r, k, i) => (r[i] = object[k], r), []); 
 

 
array.push(array.shift()); 
 

 
console.log(Object.assign({}, array)); // { 0: "Audi", 1: "BMW", 2: "Citroën", 3: "Fiat" }

一种不同的方法,同时尊重密钥。

var object = { 0: 'Fiat', 1: 'Audi', 4: 'BMW', 5: 'Citroën' }, 
 
    keys = Object.keys(object); 
 
    result = Object.assign(...keys.map((k, i) => ({ [k]: object[keys[(i + 1) % keys.length]] }))); 
 

 
console.log(result); // { 0: "Audi", 1: "BMW", 4: "Citroën", 5: "Fiat" }

1

您可以将对象转换成一个数组,做阵列上的重新排序和数组转换回一个对象:

function toObject(arr) { 
 
    var rv = {}; 
 
    for (var i = 0; i < arr.length; ++i) 
 
    rv[i] = arr[i]; 
 
    return rv; 
 
} 
 

 
function toArray(object) { 
 
    return Object.keys(object).map(function (key) { return object[key]; }); 
 
} 
 

 

 
var object = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'} 
 
var array = toArray(object); 
 
array.push(array.shift()); 
 
object = toObject(array); 
 

 
console.log(object);

0

正如Suren所说,该对象不能保证插入顺序。我建议例如另一种方法:

const o = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'}; 
const k = Object.keys(o); 
k.push(k.shift()); 
const result = k.map((v, i) => ({[i]: o[v]})) 
    .reduce((acum, v) => Object.assign(acum, v), {}); 

这里的方法是创建和索引数组,应用逻辑(推和移位),然后重新建立与映射中的对象,然后将它们合并到与减小一个对象。我认为这可能会更短(只是减少),但我想分开这更清晰。

相关问题