簡體   English   中英

基於偶數/奇數索引將數組轉換為對象

[英]Convert array to object, based on even/odd index

我試圖根據數組的索引是奇數還是偶數將數組轉換為對象。

例如,,

輸入: ["name", "Tom", "age", 20]

輸出: { "name": "tom","age": 20 }

它可以使用JavaScript的基本功能實現,例如forEachmapfilter 但我想要更簡單的代碼。

所以我檢查了underscore.js的文檔,但我找不到一個好方法。 有什么方法可以解決這個問題嗎?

有趣的問題,我的兩分錢:

簡單且高性能的循環:

const simpleArray = ["name", "Tom", "age", 20];

// Modifying the Array object
Array.prototype.toObject = function() {
    let r = {};

    for(let i = 0; i < this.length; i += 2) {
        let key = this[i], value = this[i + 1];
        r[key] = value;
    }

    return r;
}

// Or as a function
const toObject = arr => {
    let r = {};

    for(let i = 0; i < arr.length; i += 2) {
        let key = arr[i], value = arr[i + 1];
        r[key] = value;
    }

    return r;
}

const simpleObjectOne = simpleArray.toObject(); // First method
const simpleObjectTwo = toObject(simpleArray); // Second method

您可以使用Array#forEach並檢查索引(如果不均勻),然后將元素分配給最后一項的鍵。

 var array = ["name", "Tom", "age", 20], object = {}; array.forEach(function (a, i, aa) { if (i & 1) { object[aa[i - 1]] = a; } }); console.log(object); 

Array#reduce相同

 var array = ["name", "Tom", "age", 20], object = array.reduce(function (r, a, i, aa) { if (i & 1) { r[aa[i - 1]] = a; } return r; }, {}); console.log(object); 

var input = ["name", "Tom", "age", 20] ;
var output = {}
input.forEach((x, i, arr) => {
  if (i % 2 === 0) output[x] = arr[i+1];
});
console.log(output); //{ name: 'Tom', age: 20 }

您也可以使用reduce

 var arr = ["name", "Tom", "age", 20], obj = arr.reduce((p,c,i,a) => (i%2 ? p[a[i-1]] = c : p[c],p),{}); console.log(obj); 

對於此操作如下;

下划線解決方案:

output = _.object(..._.partition(input, (_, i) => !(i % 2)))

_.partition將數組分為[['name', 'age'], ["tom", "20"]] 換句話說,它返回一個包含兩個子數組的數組 - 在本例中,是一個鍵數組和一個值數組。 _.object將一組鍵和一個值數組作為參數,因此我們使用..._.partition返回的值中的子_.partition作為兩個參數_.partition給它。

如果您使用非常實用的語義代碼:

const even = i => !(i % 2);
const index = fn => (_, i) => fn(i);

output = _.object(..._.partition(input, index(even)))

遞歸解決方案:

function arrayToObject([prop, value, ...rest], result = {}) {
  return prop ? arrayToObject(rest, Object.assign(result, {[prop]: value})) : result;
}

迭代解決方案:

function arrayToObject(arr) {
  const result = {};
  while (arr.length) result[arr.shift()] = arr.shift();
  return result;
}

一個簡單的for循環

var arr = ["name", "Tom", "age", 20, "address"];
var obj = {};
for (var i = 0; i < arr.length; i+=2){
    //First iteration: assign obj["name"] to "Tom"
    //Second iteration: assign obj["age"] to 20
    //Third iteration: assign obj["address"] to "" because arr[5] does not exist
    obj[arr[i]] = arr[i+1] || "";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM