2014-10-26 97 views
3

在jQuery中,PHP的array_column()等效於什麼?我需要使用數組中的數據,而不使用循環,方式與PHP中相同。jQuery中是否有與PHP的array_column()等價的函數?

+0

http://stackoverflow.com/questions/11190407/javascript-max-for-array-column – 2014-10-26 16:14:25

+5

任何你使用會循環數組,如果不管它是一個本地方法或不 – charlietfl 2014-10-26 16:23:59

+0

的http://計算器.com/questions/7848004/get-column-from-a-two-dimensional-array – zavg 2014-10-26 20:19:13

回答

-3

你的意思是這樣的:

var a = {}; 
a['alfa'] = 0; 
a['beta'] = 1; 

alert(a['alfa']); 
+1

不回答問題 – 2014-10-26 20:32:50

+1

閱讀正確的問題。 – aBhijit 2015-12-19 05:16:46

0
var data = []; 
data.push({col1: 1, col2: 2}); 
data.push({col1: 3, col2: 4}); 
data.push({col1: 5, col2: 6}); 

Array.prototype.getColumn = function(name) { 
    return this.map(function(el) { 
     // gets corresponding 'column' 
     if (el.hasOwnProperty(name)) return el[name]; 
     // removes undefined values 
    }).filter(function(el) { return typeof el != 'undefined'; }); 
}; 

console.log(data.getColumn('col1')); 

結果

Array[3] 
0: 1 
1: 3 
2: 5 

有可能只是通過採取數組的第一個元素,並檢查其是否具有相應的跳過.filter部分鍵。但是有些行可能根本沒有這個關鍵字,而其他行可能有。

1

在這篇文章的底部是我的PHP的array_column()的JavaScript實現。不需要jQuery。

實例:

var records = [ 
    {id: 2135, first_name: 'John', last_name: 'Doe'}, 
    {id: 3245, first_name: 'Sally', last_name: 'Smith'}, 
    {id: 5342, first_name: 'Jane', last_name: 'Jones'}, 
    {id: 5623, first_name: 'Peter', last_name: 'Doe'} 
]; 
var first_names = arrayColumn(records, 'first_name'); 
// => ["John", "Sally", "Jane", "Peter"] 
var last_names = arrayColumn(records, 'last_name', 'id'); 
// => {2135: "Doe", 3245: "Smith", 5342: "Jones", 5623: "Doe"} 
var persons = arrayColumn(records, null, 'id'); 
// => { 
//  2135: {id: 2135, first_name: 'John', last_name: 'Doe'}, 
//  3245: {id: 3245, first_name: 'Sally', last_name: 'Smith'}, 
//  5342: {id: 5342, first_name: 'Jane', last_name: 'Jones'}, 
//  5623: {id: 5623, first_name: 'Peter', last_name: 'Doe'} 
// } 

實現:

/** 
* Source: http://stackoverflow.com/a/33841999/1402846 
* 
* This function is (almost) equivalent to array_column() in PHP (http://php.net/manual/function.array-column.php). 
* 
* Differences between this function and PHP's array_column(): 
* <ul> 
*  <li>If <code>indexKey</code> is not found in an element of the input array, the behaviour of this function is undefined. 
*  In PHP's array_column(), the element will be put into the end of the array. It is possible in PHP because PHP does not 
*  distinguish between arrays and dictionaries, but it is not possible in JavaScript because Arrays and Objects are different. 
* 
*  <li>Associative arrays (dictionaries) in PHP are ordered, JavaScript objects are not (http://stackoverflow.com/a/5525820/14028460. 
*  Do not make assumptions on the ordering of the keys in JavaScript objects. 
* 
*  <li>If the value of an element at <code>inputKey</code> is not a string, the result of this function and the PHP function 
*  doesn't make much sense. For example, in PHP, 
*  <code> 
*   $records = array(
*    array('id' => true, 'last_name' => 'Doe') 
*   ); 
*   array_column($records, 'last_name', 'id'); 
*  </code> 
*  gives <code>Array([1] => Doe)</code>, or maybe <code>Array([0] => Doe)</code> due to a bug ({@link https://bugs.php.net/bug.php?id=68553}). But, in JavaScript, 
*  <code> 
*   var records = [ 
*    {id: true, last_name: 'Doe'}, 
*   ]; 
*   arrayColumn(records, 'last_name', 'id'); 
*  </code> 
*  gives <code>{true: "Doe"}</code>. Therefore, it is strongly advised to make sure that the value at <code>indexKey</code> of 
*  each input element is a string. 
* </ul> 
* 
* @param {Array|Object} inputArray    The input array, it must either contain objects only or arrays only. 
*            If it is an object instead of an array, it would be converted to an array first. 
* @param {int|string|null} columnKey   If the input array contains objects, this parameter is the key in each object. 
*            If the input array contains arrays, this parameter is the index in each array. 
*            If the key or index is not valid, this element is skipped. 
*            This parameter may also be <code>null</code>. 
* @param {int|string|null} [indexKey=null]  If the input array contains objects, this parameter must be a valid key in each object. 
*            If the input array contains arrays, this parameter must be a valid index in each array. 
*            If it is not a valid key or index, the behaviour is undefined. 
*            This parameter may also be <code>null</code>. 
* @returns {Array|Object}      If <code>indexKey</code> is <code>null</code>, this function returns an array which is parallel 
*            to the input array. For each element <code>elem</code> in the input array, the element in the 
*            output array would be <code>elem[columnKey]</code>, or just <code>elem</code> if <code>columnKey</code> 
*            is <code>null</code>. 
*            If <code>indexKey</code> is <b>not</b> <code>null</code>, this function returns an object. 
*            For each element <code>elem</code> in the input array, the output object would contain an 
*            element <code>elem[columnKey]</code>, or just <code>elem</code> if <code>columnKey</code> 
*            is <code>null</code>, at the key <code>elem[indexKey]</code>. If the value of <code>elem[indexKey]</code> 
*            of some elements in the input array are duplicated, the element in the return object would 
*            correspond to the element nearest to the end of the input array. 
* @example 
* var records = [ 
*  {id: 2135, first_name: 'John', last_name: 'Doe'}, 
*  {id: 3245, first_name: 'Sally', last_name: 'Smith'}, 
*  {id: 5342, first_name: 'Jane', last_name: 'Jones'}, 
*  {id: 5623, first_name: 'Peter', last_name: 'Doe'} 
* ]; 
* var first_names = arrayColumn(records, 'first_name'); 
* >> ["John", "Sally", "Jane", "Peter"] 
* var last_names = arrayColumn(records, 'last_name', 'id'); 
* >> {2135: "Doe", 3245: "Smith", 5342: "Jones", 5623: "Doe"} 
* var persons = arrayColumn(records, null, 'id'); 
* >> { 
*  2135: {id: 2135, first_name: 'John', last_name: 'Doe'}, 
*  3245: {id: 3245, first_name: 'Sally', last_name: 'Smith'}, 
*  5342: {id: 5342, first_name: 'Jane', last_name: 'Jones'}, 
*  5623: {id: 5623, first_name: 'Peter', last_name: 'Doe'} 
* } 
*/ 
function arrayColumn(inputArray, columnKey, indexKey) 
{ 
    function isArray(inputValue) 
    { 
     return Object.prototype.toString.call(inputValue) === '[object Array]'; 
    } 

    // If input array is an object instead of an array, 
    // convert it to an array. 
    if(!isArray(inputArray)) 
    { 
     var newArray = []; 
     for(var key in inputArray) 
     { 
      if(!inputArray.hasOwnProperty(key)) 
      { 
       continue; 
      } 
      newArray.push(inputArray[key]); 
     } 
     inputArray = newArray; 
    } 

    // Process the input array. 
    var isReturnArray = (typeof indexKey === 'undefined' || indexKey === null); 
    var outputArray = []; 
    var outputObject = {}; 
    for(var inputIndex = 0; inputIndex < inputArray.length; inputIndex++) 
    { 
     var inputElement = inputArray[inputIndex]; 

     var outputElement; 
     if(columnKey === null) 
     { 
      outputElement = inputElement; 
     } 
     else 
     { 
      if(isArray(inputElement)) 
      { 
       if(columnKey < 0 || columnKey >= inputElement.length) 
       { 
        continue; 
       } 
      } 
      else 
      { 
       if(!inputElement.hasOwnProperty(columnKey)) 
       { 
        continue; 
       } 
      } 

      outputElement = inputElement[columnKey]; 
     } 

     if(isReturnArray) 
     { 
      outputArray.push(outputElement); 
     } 
     else 
     { 
      outputObject[inputElement[indexKey]] = outputElement; 
     } 
    } 

    return (isReturnArray ? outputArray : outputObject); 
} 
0

我使用它來建立一個對象〜像關聯數組的php。通過選擇源數組的.id,並將該id作爲新數組的索引幷包含舊源數組的相同內容。

var categoriesById={}; 

for(item in cacheObject.Categories){ 
categoriesById[cacheObject.Categories[item].id]=cacheObject.Categories[item]; 
} 
2

您可以使用.map()來實現。 Immagine取數據庫行。

var array = [ 
    { 
     id: 1, 
     name: 'foo' 
    }, 
    { 
     id: 2, 
     name: 'bar' 
    }, 
]; 
var names = arrayColumn(array, 'name'); 
console.log(names); 

function arrayColumn(array, columnName) { 
    return array.map(function(value,index) { 
     return value[columnName]; 
    }) 
} 
相關問題