簡體   English   中英

在javascript中從現有數組創建自定義數組

[英]creating custom array from existing array in javascript

我有一個如下所示的數組:

var search = [
    { code: "t1", name1: "n1", name2: "n2" },
    { code: "t1", name1: "n5", name2: "n6" },
    { code: "t2", name1: "n10", name2: "n11" },
    { code: "t2", name1: "n18", name2: "n20" },
    { code: "t3", name1: "n18", name2: "n20" },
];

我想將此數組轉換為以下格式:

var finald = [
    { code: "t1", name1: "n1,n5", name2: "n2,n6" },
    { code: "t2", name1: "n10,n18", name2: "11,n20" },
    { code: "t3", name1: "n18", name2: "n20" },
];

我已經嘗試過如下代碼。 但沒有成功。 首先,我從數組中收集了所有唯一的code

var flags = [];
var codes = [];
for(var z=0; z<search.length; z++){
    if( flags[data[z].code]) continue;
    flags[data[z].code] = true;
    codes.push(data[z].code);
}

var finald = [];
for(var i=0; i<search.length; i++){

    var name1 = [];
    var name2 = [];
    for(var y=0; y<codes.length; y++){
        if(codes[y] == search[i].code ){

                var row = {
                    code: codes[y],
                    name1:search[i].name1,
                    name2:search[i].name2,


                };
                finald.push(row);
        }
    }   
}

請幫忙。

這不是你所要求的,但仍然嘗試這種方法。

您基本上想通過鍵“代碼”對數組執行“加入”操作,因此可以嘗試將數組轉換為map對象 - key: code , value : {name1, name2}

提琴手

var search = [
  {code:"t1", name1:"n1", name2:"n2"},
  {code:"t1", name1:"n5", name2:"n6"},
  {code:"t2", name1:"n10", name2:"n11"},
  {code:"t2", name1:"n18", name2:"n20"},
  {code:"t3", name1:"n18", name2:"n20"}];

const myMap = new Map();

search.forEach((obj) => {
  const key = obj.code;
  if(!myMap.has(key)) {
    myMap.set(key, {
      'name1' : obj.name1,
      'name2' : obj.name2
    });
  } else {
    var ele = myMap.get(key);
    ele.name1 = `${ele.name1},${obj.name1}`;
    ele.name2 = `${ele.name2},${obj.name2}`;
  }
}); 
console.log(myMap);

/*
    key: "t1" => value: {name1:"n1,n5", name2:"n2,n6"},
    key: "t2" => value: {name1:"n10,n18", name2:"n11,n20"},
    key: "t3" => value: {name1:"n18", name2:"n20"}
*/

如果你必須以數組形式將它添加到上面, jsfiddle

var resArray = [];
myMap.forEach((value, key) => {
    resArray.push(Object.assign({'code': key}, value));
});

console.log(resArray);

/*
    [{ code: "t1", name1: "n1,n5", name2: "n2,n6" },
     { code: "t2", name1: "n10,n18", name2: "11,n20" },
     { code: "t3", name1: "n18", name2: "n20" }]
*/

像這樣的東西?

您可以使用 reduce 或 map ,但在我看來,這對於一個簡單的任務來說更容易理解

我假設搜索是按代碼排序的。

 var search = [ {code:"t1", name1:"n1", name2:"n2"}, {code:"t1", name1:"n5", name2:"n6"}, {code:"t2", name1:"n10", name2:"n11"}, {code:"t2", name1:"n18", name2:"n20"}, {code:"t3", name1:"n18", name2:"n20"} ], finald = []; finald.push(search[0]); for (var i = 1; i < search.length; i++) { var f = finald[finald.length - 1]; if (f.code == search[i].code) { f.name1 += ","+search[i].name1; f.name2 += ","+search[i].name2; } else { finald.push(search[i]); } } console.log(finald);

這應該做你想做的:

 var search = [ { code: "t1", name1: "n1", name2: "n2" }, { code: "t1", name1: "n5", name2: "n6" }, { code: "t2", name1: "n10", name2: "n11" }, { code: "t2", name1: "n18", name2: "n20" }, { code: "t3", name1: "n18", name2: "n20" } ]; const items = search.reduce((acc, item) => { const code = item.code; if (!acc[code]) acc[code] = {name1: [], name2: []}; acc[code].name1.push(item.name1); acc[code].name2.push(item.name2); return acc; }, {}); const finald = Object.keys(items).reduce((acc, key) => { const item = items[key]; acc.push({ code: key, name1: item.name1.join(','), name2: item.name2.join(',') }); return acc; }, []);

您可以為此創建自己的自定義邏輯:

 var search = [ { code: "t1", name1: "n1", name2: "n2" }, { code: "t1", name1: "n5", name2: "n6" }, { code: "t2", name1: "n10", name2: "n11" }, { code: "t2", name1: "n18", name2: "n20" }, { code: "t3", name1: "n18", name2: "n20" }, ]; //this is the result array var result = []; //this is a flag var itemExist = false; search.forEach((item) => { //reset flag to false itemExist = false; //check if the object already exist in the result array or not for(var i=0; i<result.length; i++){ //if the object exist then merge the values of name1 and name2 if(result[i].code === item.code){ result[i].name1 = result[i].name1 +','+item.name1; result[i].name2 = result[i].name2 +','+item.name2; itemExist = true; //break the for loop break; } } //if object do not exist in the result array then push it if(!itemExist){ result.push(item); } }); console.log(result);

我寫了這個函數:

function normalize(arr) {
    var output = [];
      for(var i = 0; i < arr.length; i++) {
        var codeIndex = _findIndex(output, arr[i].code);
        if(codeIndex !== -1) {
          // Code already in output array, merge names.
          output[_findIndex(output, arr[i].code)].name1 += ', ' + arr[i].name1;
          output[_findIndex(arr[i].code)].name2 += ', ' + arr[i].name2;
        }
        else {
          // Code new to output array, pus into.
          output.push(arr[i]);
        }
      }

      return output;

      //
      // Privates
      //

      function _findIndex(arr, code){
        var index = -1;
        for(var i = 0; i < arr.length; i++){
          if(arr[i].code == code) {
            index = i;
            break;
          }
        }
        return index;
      }
    }

輸出:

0 : {code: "t1", name1: "n1, n5", name2: "n2, n6, n20"}
1 : {code: "t2", name1: "n10, n18", name2: "n11"}
2 : {code: "t3", name1: "n18", name2: "n20"}

您可以使用reducemap

 let search = [{code:"t1", name1:"n1", name2:"n2"},{code:"t1", name1:"n5", name2:"n6"},{code:"t2", name1:"n10", name2:"n11"},{code:"t2", name1:"n18", name2:"n20"},{code:"t3", name1:"n18", name2:"n20"},]; let result = Object.values( search.reduce( (c,v) => { c[ v.code ] ? c[ v.code ].push( v ) : c[ v.code ] =[ v ]; return c; },{}) ).map( v => { let n1 = [], n2 = []; v.forEach( e => { n1.push( e.name1 ); n2.push( e.name2 ); }); return { code : v[0].code, name1 : n1.join(","), name2 : n2.join(",") } }); console.log( result );

另一個解決問題的方法 - 這段代碼強調數據的不變性,從所有迭代中返回新對象。 這可能會防止在執行此類操作時難以發現錯誤:

 var finald = transform([ { code: "t1", name1: "n1", name2: "n2" }, { code: "t1", name1: "n5", name2: "n6" }, { code: "t2", name1: "n10", name2: "n11" }, { code: "t2", name1: "n18", name2: "n20" }, { code: "t3", name1: "n18", name2: "n20" }, ]); console.log(finald); function transform(source) { const keyedByCode = source.reduce((acc, item) => { const { name1 = [], name2 = [] } = acc[item.code] || {}; return Object.assign({}, acc, { [item.code]: { name1: [item.name1, ...name1], name2: [item.name2, ...name2], }, }); }, {}); return Object.keys(keyedByCode).map((code) => ({ code, name1: keyedByCode[code].name1.sort().join(','), name2: keyedByCode[code].name2.sort().join(','), })); }
 .as-console-wrapper { max-height: 100% !important; }

代碼的順序在這里無關緊要:

 const search = [{code:"t1", name1:"n1", name2:"n2"}, {code:"t1", name1:"n5", name2:"n6"}, {code:"t2", name1:"n10", name2:"n11"}, {code:"t2", name1:"n18", name2:"n20"}, {code:"t3", name1:"n18", name2:"n20"}]; function combineObjectsByCode(objects) { let codes = new Set(); objects.forEach(object => codes.add(object.code)); let combinedObjects = []; codes.forEach(code => { let objectsWithSameCode = objects.filter(object => object.code === code); let combinedObject; objectsWithSameCode.forEach( obj => { if (!combinedObject) { combinedObject = obj; } else { combinedObject.name1 = combinedObject.name1 + ', ' + obj.name1; combinedObject.name2 = combinedObject.name2 + ', ' + obj.name2; } }) combinedObjects.push(combinedObject); }); return combinedObjects; } console.log(combineObjectsByCode(search));

您可以使用array#reduce根據code對數組進行分組,並將相同的值推送到數組中。 使用Object.values()獲取所有值,然后使用array#map使用array#join()將數組轉換為字符串。

 var search = [{ code: "t1", name1: "n1", name2: "n2" },{ code: "t1", name1: "n5", name2: "n6" },{ code: "t2", name1: "n10", name2: "n11" },{ code: "t2", name1: "n18", name2: "n20" },{ code: "t3", name1: "n18", name2: "n20" }], result = Object.values(search.reduce((r,{code,name1, name2}) => { r[code] = r[code] || {code, name1: [], name2: []}; r[code].name1.push(name1); r[code].name2.push(name2); return r; },{})) .map(({code,name1,name2}) => ({code, name1: name1.join(','), name2: name2.join(',')})); console.log(result);

暫無
暫無

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

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