Сравнить элементы массива (элементы являются массивами), если элементы в одной позиции равны - PullRequest
3 голосов
/ 16 июня 2019

Я использую Adobe ExtendScript Toolkit для отладки.Я пишу для InDesign и действительно не имею глубоких знаний JavaScript (и не знаю, что означает ES6).ExtendScript не принимает let как зарезервированное слово.Может быть, что-то в этом ES6 вы имеете в виду?

Мне нужно сравнить все элементы в массиве и объединить некоторые из них, если один из его дочерних элементов совпадает.Позвольте мне объяснить:

На основе следующего массива:

var array = [[1,"luis"] , [2,"felipe"] , [2,"erick"] , [2,"mark"] , [3,"dustin"]]

Итак, я хочу получить в результате этот массив:

var array = [[1,"luis"] , [2,"felipe; erick; mark"] , [3,"dustin"]]

Как я могу сравнитьэлементы массива, чтобы получить желаемый результат?

Я уже пробовал два цикла и некоторое время.Может быть, я сделал их неправильно.Поэтому я здесь, чтобы спросить вас, ребята.

Если я использую это:

for (var i=0; i<array.length-1; i++) {
    for (var j=i+1; j<array.length; j++) {
        if (array[i][0] == array[j][0]) {
            array[i][1] = array[i][1] + "; " + array[j][1];
            }
        }
    }

У меня есть все результаты.Как это:

1,luis
2,felipe; erick; mark
2,erick; mark
2,mark
3,dustin

Ответы [ 7 ]

1 голос
/ 16 июня 2019

Используйте Object.entries и reduce.

var array = [[1,"luis"] , [2,"felipe"] , [2,"erick"] , [2,"mark"] , [3,"dustin"]];
const res = Object.entries(array.reduce((a, [n, s]) => (a[n] = a[n] ? a[n] + "; " + s : s, a), {}));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 16 июня 2019
let arr = [
    [1, "luis"],
    [3, "felipe"],
    [2, "erick"],
    [3, "mark"],
    [3, "dustin"]
];

let res = arr.reduce((acc,cur) => {
    const item = acc.find((obj) => {
        if(obj[0] === cur[0]){
            obj.push(cur[1]);
            return obj
        }
    });
    if(!item)
        acc.push(cur);
    return acc
},[]);
0 голосов
/ 16 июня 2019

Спасибо всем за ваши предложения. Мне очень жаль, потому что я очень новичок и просто знаком с javascript во время написания кода для автоматизации программного обеспечения Adobe. Я нашел способ, используя:

var array = [[1,"luis"] , [2,"felipe"] , [2,"erick"] , [2,"mark"] , [3,"dustin"]];
for (var i=0; i<array.length-1; i++) {
    var j = i+1;
    while (j < array.length) {
        if (array[i][0] == array[j][0]) {
            array[i][1] = array[i][1] + "; " + array[j][1];
            array.splice(j , 1);
            j = i;
            }
        j++;
        }
    }
alert(array.join("\r"));
0 голосов
/ 16 июня 2019

Вот решение ниже

var array = [[1,"luis"] , [2,"felipe"] , [2,"erick"] , [2,"mark"] , [3,"dustin"]]

function mergeArrayBySameId(){
  let old = [];
  let mergedArr = [];
  array.map(function(curr, i){
    let tmp = "";
    let current = array[i];
    let prev    = ( i === 0 ) ? [] : array[i-1];

    if( current[0] === prev[0] ){
       tmp    = current[0];
       mergedArr[0] = tmp;

       if( !mergedArr.includes( prev[1] ) ){
          mergedArr.push( prev[1] );
       }

       mergedArr.push( current[1] );

    }
    old = prev;

  });

  let mergedStr = ""
  let mergedArrId = mergedArr[0];
  mergedArr.map(function(val){
     if( typeof val !== 'number' ){
          mergedStr += val + "; ";
     }
  });
  mergedArr = [];
  mergedArr[0] = mergedArrId;
  mergedArr[1] = mergedStr;

  function checkId(id){
    return mergedArr[0] != id[0];
  }

  let filterArray = array.filter(checkId);
  let finalArray = filterArray.concat([mergedArr]).sort();
  
  return finalArray;
}

console.log( mergeArrayBySameId() );
0 голосов
/ 16 июня 2019

Вы можете использовать уменьшить и карту

  • Первая группа по первому элементу в подмассиве
  • отображать записи в желаемый формат

var array = [[1,"luis"] , [2,"felipe"] , [2,"erick"] , [2,"mark"] , [3,"dustin"]]

let op = array.reduce((op,inp)=>{
  op[inp[0]] = op[inp[0]] || []
  op[inp[0]].push(inp[1])
  return op
},{})

let final = Object.entries(op).map(([key,value])=> [+key,value.join('; ')])

console.log(final)
0 голосов
/ 16 июня 2019

Вы можете использовать методы Object.entries() и Array .reduce(), чтобы получить желаемый результат:

const data = [[1,"luis"] , [2,"felipe"] , [2,"erick"] , [2,"mark"] , [3,"dustin"]];

const result = Object.entries(data.reduce((r, [key, val]) => {
  r[key] = key in r ? [r[key].toString() + "; " + val] : val;
  return r;
}, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 16 июня 2019

Вы можете использовать reduce

var array = [
  [1, "luis"],
  [2, "felipe"],
  [2, "erick"],
  [2, "mark"],
  [3, "dustin"]
]
const result = array.reduce(function(re, arr) {
  const item = re.find(function(o) {
    return o[0] === arr[0]
  })
  typeof item === 'undefined' ? re.push(arr) : (item[1] = item[1] + ';' + arr[1])
  return re
}, [])
console.log(result)
...