Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中合并和排序两个对象数组_Javascript_Arrays_Sorting - Fatal编程技术网

在Javascript中合并和排序两个对象数组

在Javascript中合并和排序两个对象数组,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有两个数组,根据元素在数组中的位置,它接收一个值。两个数组包含相同的元素,但位置不同。我想计算每个元素的值,将数组合并到单个数组中,并对新数组进行排序 var ranks = [], objArray1 = [], objArray2 = []; // 'aaa' = 5, 'bbb' = 4, 'ddd' = 3, 'eee' = 2, 'ccc' = 1 var array1 = ['aaa', 'bbb', 'ddd', 'eee', 'ccc']; // 'ddd'

我有两个数组,根据元素在数组中的位置,它接收一个值。两个数组包含相同的元素,但位置不同。我想计算每个元素的值,将数组合并到单个数组中,并对新数组进行排序

var ranks = [],
    objArray1 = [],
    objArray2 = [];

// 'aaa' = 5, 'bbb' = 4, 'ddd' = 3, 'eee' = 2, 'ccc' = 1
var array1 = ['aaa', 'bbb', 'ddd', 'eee', 'ccc'];

// 'ddd' = 5, 'ccc' = 4, 'aaa' = 3, 'bbb' = 2, 'eee' = 1
var array2 = ['ddd', 'ccc', 'aaa', 'bbb', 'eee'];

for (var i = 0, x = 5; i < 5; x--, i++) {
  var obj = {};
  obj[array1[i]] = x;
  objArray1.push(obj);
}

for (var i = 0, x = 5; i < 5; x--, i++) {
  var obj = {};
  obj[array2[i]] = x;
  objArray2.push(obj);
}

// combine both object arrays, match keys, but add values
// should output ranks =[{aaa: 8}, {bbb: 6}, {ccc: 5}, {ddd: 8}, {eee: 3}]

// then sort based on value
// should output ranks = [{aaa: 8}, {ddd: 8}, {bbb: 6}, {ccc: 5}, {eee: 3}]

// then copy keys over to new array while keeping position
// should output var final = ['aaa', 'ddd', 'bbb', 'ccc', 'eee']
我能想到的唯一办法是将初始数组转换为对象数组,合并它们,按对象值排序,然后将顺序映射到新数组中

var ranks = [],
    objArray1 = [],
    objArray2 = [];

// 'aaa' = 5, 'bbb' = 4, 'ddd' = 3, 'eee' = 2, 'ccc' = 1
var array1 = ['aaa', 'bbb', 'ddd', 'eee', 'ccc'];

// 'ddd' = 5, 'ccc' = 4, 'aaa' = 3, 'bbb' = 2, 'eee' = 1
var array2 = ['ddd', 'ccc', 'aaa', 'bbb', 'eee'];

for (var i = 0, x = 5; i < 5; x--, i++) {
  var obj = {};
  obj[array1[i]] = x;
  objArray1.push(obj);
}

for (var i = 0, x = 5; i < 5; x--, i++) {
  var obj = {};
  obj[array2[i]] = x;
  objArray2.push(obj);
}

// combine both object arrays, match keys, but add values
// should output ranks =[{aaa: 8}, {bbb: 6}, {ccc: 5}, {ddd: 8}, {eee: 3}]

// then sort based on value
// should output ranks = [{aaa: 8}, {ddd: 8}, {bbb: 6}, {ccc: 5}, {eee: 3}]

// then copy keys over to new array while keeping position
// should output var final = ['aaa', 'ddd', 'bbb', 'ccc', 'eee']
var秩=[],
objArray1=[],
objArray2=[];
//“aaa”=5,“bbb”=4,“ddd”=3,“eee”=2,“ccc”=1
var array1=['aaa','bbb','ddd','eee','ccc'];
//“ddd”=5,“ccc”=4,“aaa”=3,“bbb”=2,“eee”=1
var array2=['ddd','ccc','aaa','bbb','eee'];
对于(变量i=0,x=5;i<5;x--,i++){
var obj={};
obj[array1[i]]=x;
objArray1.推送(obj);
}
对于(变量i=0,x=5;i<5;x--,i++){
var obj={};
obj[array2[i]]=x;
objArray2.推送(obj);
}
//组合两个对象数组,匹配关键点,但添加值
//应该输出秩=[{aaa:8},{bbb:6},{ccc:5},{ddd:8},{eee:3}]
//然后根据值进行排序
//应该输出秩=[{aaa:8},{ddd:8},{bbb:6},{ccc:5},{eee:3}]
//然后在保持位置的同时将关键点复制到新阵列
//应输出var final=['aaa','ddd','bbb','ccc','eee']

您可以跳过带有对象的新临时数组的部分,只取一个对象进行计数,然后取排序后的键作为结果

var array1=['aaa','bbb','ddd','eee','ccc'],
array2=['ddd'、'ccc'、'aaa'、'bbb'、'eee'],
temp=对象创建(空),
结果;
[array1,array2].forEach(a=>a.forEach((k,i)=>temp[k]=(temp[k]|0)-i));
结果=对象键(temp).sort((a,b)=>temp[b]-temp[a]);

控制台日志(结果)
您可以使用
reduce
创建对象,然后在
object.keys上使用
sort

const array1=['aaa','bbb','ddd','eee','ccc'];
常量数组2=['ddd'、'ccc'、'aaa'、'bbb'、'eee'];
常数n=阵列1.长度;
常数r=array1.reduce((r,e,i)=>(r[e]=n-i+n-array2.indexOf(e,r),{})
const result=Object.keys(r).sort((a,b)=>r[b]-r[a])

console.log(result)
这看起来像是一个家庭作业/面试问题?你只想按元素在两个数组上的和对元素进行排序?预期结果是什么?嘿,这真聪明!非常感谢!我正在研究的解决方案只是一堆循环,这要干净得多。