2017-09-06 40 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), {}); 

這裏的方法是創建和索引數組,應用邏輯(推和移位),然後重新建立與映射中的對象,然後將它們合併到與減小一個對象。我認爲這可能會更短(只是減少),但我想分開這更清晰。

相關問題